Merge branch 'i2c/for-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[cascardo/linux.git] / drivers / irqchip / irq-atmel-aic.c
index 9a2cf3c..dae3604 100644 (file)
@@ -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(0xffffffff, gc->reg_base + AT91_AIC_IDCR);
-       irq_reg_writel(0xffffffff, gc->reg_base + AT91_AIC_ICCR);
+       irq_reg_writel(gc, 0xffffffff, AT91_AIC_IDCR);
+       irq_reg_writel(gc, 0xffffffff, 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(0xffffffff, gc->reg_base + AT91_AIC_SPU);
+       irq_reg_writel(gc, 0xffffffff, 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(0xffffffff, gc->reg_base + AT91_AIC_IDCR);
-       irq_reg_writel(0xffffffff, gc->reg_base + AT91_AIC_ICCR);
+       irq_reg_writel(gc, 0xffffffff, AT91_AIC_IDCR);
+       irq_reg_writel(gc, 0xffffffff, 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 aic_irq_domain_xlate(struct irq_domain *d,
@@ -195,10 +195,10 @@ static int aic_irq_domain_xlate(struct irq_domain *d,
        gc = dgc->gc[idx];
 
        irq_gc_lock(gc);
-       smr = irq_reg_readl(gc->reg_base + AT91_AIC_SMR(*out_hwirq));
+       smr = irq_reg_readl(gc, AT91_AIC_SMR(*out_hwirq));
        ret = aic_common_set_priority(intspec[2], &smr);
        if (!ret)
-               irq_reg_writel(smr, gc->reg_base + AT91_AIC_SMR(*out_hwirq));
+               irq_reg_writel(gc, smr, AT91_AIC_SMR(*out_hwirq));
        irq_gc_unlock(gc);
 
        return ret;
@@ -209,16 +209,32 @@ static const struct irq_domain_ops aic_irq_ops = {
        .xlate  = aic_irq_domain_xlate,
 };
 
-static void __init at91sam9_aic_irq_fixup(struct device_node *root)
+static void __init at91rm9200_aic_irq_fixup(struct device_node *root)
 {
        aic_common_rtc_irq_fixup(root);
 }
 
+static void __init at91sam9260_aic_irq_fixup(struct device_node *root)
+{
+       aic_common_rtt_irq_fixup(root);
+}
+
+static void __init at91sam9g45_aic_irq_fixup(struct device_node *root)
+{
+       aic_common_rtc_irq_fixup(root);
+       aic_common_rtt_irq_fixup(root);
+}
+
 static const struct of_device_id __initdata aic_irq_fixups[] = {
-       { .compatible = "atmel,at91sam9g45", .data = at91sam9_aic_irq_fixup },
-       { .compatible = "atmel,at91sam9n12", .data = at91sam9_aic_irq_fixup },
-       { .compatible = "atmel,at91sam9rl", .data = at91sam9_aic_irq_fixup },
-       { .compatible = "atmel,at91sam9x5", .data = at91sam9_aic_irq_fixup },
+       { .compatible = "atmel,at91rm9200", .data = at91rm9200_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9g45", .data = at91sam9g45_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9n12", .data = at91rm9200_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9rl", .data = at91sam9g45_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9x5", .data = at91rm9200_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9260", .data = at91sam9260_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9261", .data = at91sam9260_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9263", .data = at91sam9260_aic_irq_fixup },
+       { .compatible = "atmel,at91sam9g20", .data = at91sam9260_aic_irq_fixup },
        { /* sentinel */ },
 };