diff options
| -rw-r--r-- | arch/arm/mach-tegra/include/mach/iomap.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-tegra/include/mach/irqs.h | 7 | ||||
| -rw-r--r-- | arch/arm/mach-tegra/irq.c | 20 |
3 files changed, 23 insertions, 7 deletions
diff --git a/arch/arm/mach-tegra/include/mach/iomap.h b/arch/arm/mach-tegra/include/mach/iomap.h index 19dec3ac0854..67644c905d8e 100644 --- a/arch/arm/mach-tegra/include/mach/iomap.h +++ b/arch/arm/mach-tegra/include/mach/iomap.h | |||
| @@ -74,6 +74,9 @@ | |||
| 74 | #define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300 | 74 | #define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300 |
| 75 | #define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64 | 75 | #define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64 |
| 76 | 76 | ||
| 77 | #define TEGRA_QUINARY_ICTLR_BASE 0x60004400 | ||
| 78 | #define TEGRA_QUINARY_ICTLR_SIZE SZ_64 | ||
| 79 | |||
| 77 | #define TEGRA_TMR1_BASE 0x60005000 | 80 | #define TEGRA_TMR1_BASE 0x60005000 |
| 78 | #define TEGRA_TMR1_SIZE SZ_8 | 81 | #define TEGRA_TMR1_SIZE SZ_8 |
| 79 | 82 | ||
diff --git a/arch/arm/mach-tegra/include/mach/irqs.h b/arch/arm/mach-tegra/include/mach/irqs.h index a2146cd6867d..aad1a2c1d714 100644 --- a/arch/arm/mach-tegra/include/mach/irqs.h +++ b/arch/arm/mach-tegra/include/mach/irqs.h | |||
| @@ -165,11 +165,12 @@ | |||
| 165 | #define INT_QUAD_RES_30 (INT_QUAD_BASE + 30) | 165 | #define INT_QUAD_RES_30 (INT_QUAD_BASE + 30) |
| 166 | #define INT_QUAD_RES_31 (INT_QUAD_BASE + 31) | 166 | #define INT_QUAD_RES_31 (INT_QUAD_BASE + 31) |
| 167 | 167 | ||
| 168 | #define INT_MAIN_NR (INT_QUAD_BASE + 32 - INT_PRI_BASE) | 168 | /* Tegra30 has 5 banks of 32 IRQs */ |
| 169 | 169 | #define INT_MAIN_NR (32 * 5) | |
| 170 | #define INT_GPIO_BASE (INT_PRI_BASE + INT_MAIN_NR) | 170 | #define INT_GPIO_BASE (INT_PRI_BASE + INT_MAIN_NR) |
| 171 | 171 | ||
| 172 | #define INT_GPIO_NR (28 * 8) | 172 | /* Tegra30 has 8 banks of 32 GPIOs */ |
| 173 | #define INT_GPIO_NR (32 * 8) | ||
| 173 | 174 | ||
| 174 | #define TEGRA_NR_IRQS (INT_GPIO_BASE + INT_GPIO_NR) | 175 | #define TEGRA_NR_IRQS (INT_GPIO_BASE + INT_GPIO_NR) |
| 175 | 176 | ||
diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c index 4e1afcd54fae..2f5bd2db8e1f 100644 --- a/arch/arm/mach-tegra/irq.c +++ b/arch/arm/mach-tegra/irq.c | |||
| @@ -44,14 +44,16 @@ | |||
| 44 | #define ICTLR_COP_IER_CLR 0x38 | 44 | #define ICTLR_COP_IER_CLR 0x38 |
| 45 | #define ICTLR_COP_IEP_CLASS 0x3c | 45 | #define ICTLR_COP_IEP_CLASS 0x3c |
| 46 | 46 | ||
| 47 | #define NUM_ICTLRS 4 | ||
| 48 | #define FIRST_LEGACY_IRQ 32 | 47 | #define FIRST_LEGACY_IRQ 32 |
| 49 | 48 | ||
| 49 | static int num_ictlrs; | ||
| 50 | |||
| 50 | static void __iomem *ictlr_reg_base[] = { | 51 | static void __iomem *ictlr_reg_base[] = { |
| 51 | IO_ADDRESS(TEGRA_PRIMARY_ICTLR_BASE), | 52 | IO_ADDRESS(TEGRA_PRIMARY_ICTLR_BASE), |
| 52 | IO_ADDRESS(TEGRA_SECONDARY_ICTLR_BASE), | 53 | IO_ADDRESS(TEGRA_SECONDARY_ICTLR_BASE), |
| 53 | IO_ADDRESS(TEGRA_TERTIARY_ICTLR_BASE), | 54 | IO_ADDRESS(TEGRA_TERTIARY_ICTLR_BASE), |
| 54 | IO_ADDRESS(TEGRA_QUATERNARY_ICTLR_BASE), | 55 | IO_ADDRESS(TEGRA_QUATERNARY_ICTLR_BASE), |
| 56 | IO_ADDRESS(TEGRA_QUINARY_ICTLR_BASE), | ||
| 55 | }; | 57 | }; |
| 56 | 58 | ||
| 57 | static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg) | 59 | static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg) |
| @@ -60,7 +62,7 @@ static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg) | |||
| 60 | u32 mask; | 62 | u32 mask; |
| 61 | 63 | ||
| 62 | BUG_ON(irq < FIRST_LEGACY_IRQ || | 64 | BUG_ON(irq < FIRST_LEGACY_IRQ || |
| 63 | irq >= FIRST_LEGACY_IRQ + NUM_ICTLRS * 32); | 65 | irq >= FIRST_LEGACY_IRQ + num_ictlrs * 32); |
| 64 | 66 | ||
| 65 | base = ictlr_reg_base[(irq - FIRST_LEGACY_IRQ) / 32]; | 67 | base = ictlr_reg_base[(irq - FIRST_LEGACY_IRQ) / 32]; |
| 66 | mask = BIT((irq - FIRST_LEGACY_IRQ) % 32); | 68 | mask = BIT((irq - FIRST_LEGACY_IRQ) % 32); |
| @@ -113,8 +115,18 @@ static int tegra_retrigger(struct irq_data *d) | |||
| 113 | void __init tegra_init_irq(void) | 115 | void __init tegra_init_irq(void) |
| 114 | { | 116 | { |
| 115 | int i; | 117 | int i; |
| 118 | void __iomem *distbase; | ||
| 119 | |||
| 120 | distbase = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE); | ||
| 121 | num_ictlrs = readl_relaxed(distbase + GIC_DIST_CTR) & 0x1f; | ||
| 122 | |||
| 123 | if (num_ictlrs > ARRAY_SIZE(ictlr_reg_base)) { | ||
| 124 | WARN(1, "Too many (%d) interrupt controllers found. Maximum is %d.", | ||
| 125 | num_ictlrs, ARRAY_SIZE(ictlr_reg_base)); | ||
| 126 | num_ictlrs = ARRAY_SIZE(ictlr_reg_base); | ||
| 127 | } | ||
| 116 | 128 | ||
| 117 | for (i = 0; i < NUM_ICTLRS; i++) { | 129 | for (i = 0; i < num_ictlrs; i++) { |
| 118 | void __iomem *ictlr = ictlr_reg_base[i]; | 130 | void __iomem *ictlr = ictlr_reg_base[i]; |
| 119 | writel(~0, ictlr + ICTLR_CPU_IER_CLR); | 131 | writel(~0, ictlr + ICTLR_CPU_IER_CLR); |
| 120 | writel(0, ictlr + ICTLR_CPU_IEP_CLASS); | 132 | writel(0, ictlr + ICTLR_CPU_IEP_CLASS); |
| @@ -131,6 +143,6 @@ void __init tegra_init_irq(void) | |||
| 131 | * initialized elsewhere under DT. | 143 | * initialized elsewhere under DT. |
| 132 | */ | 144 | */ |
| 133 | if (!of_have_populated_dt()) | 145 | if (!of_have_populated_dt()) |
| 134 | gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), | 146 | gic_init(0, 29, distbase, |
| 135 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); | 147 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); |
| 136 | } | 148 | } |
