diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2015-03-11 11:43:03 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2015-03-14 20:40:52 -0400 |
commit | 1a703bffd82e04d1c00a0b4373bf4db1e2d25681 (patch) | |
tree | e92ea370f89f93e694f18bf0bf7afb1493ee8a81 /arch/arm | |
parent | f6f53169ead6c9604b4358ccc7e0568d7bba2941 (diff) |
ARM: tegra: remove old LIC support
Now that all DTs have been updated, entierely drop support for
the non-DT code.
This is likely to break platforms that do not update their DT,
so print a warning at boot time.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Link: https://lkml.kernel.org/r/1426088583-15097-7-git-send-email-marc.zyngier@arm.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-tegra/iomap.h | 15 | ||||
-rw-r--r-- | arch/arm/mach-tegra/irq.c | 201 | ||||
-rw-r--r-- | arch/arm/mach-tegra/irq.h | 6 |
3 files changed, 2 insertions, 220 deletions
diff --git a/arch/arm/mach-tegra/iomap.h b/arch/arm/mach-tegra/iomap.h index ee79808e93a3..81dc950b4881 100644 --- a/arch/arm/mach-tegra/iomap.h +++ b/arch/arm/mach-tegra/iomap.h | |||
@@ -31,21 +31,6 @@ | |||
31 | #define TEGRA_ARM_INT_DIST_BASE 0x50041000 | 31 | #define TEGRA_ARM_INT_DIST_BASE 0x50041000 |
32 | #define TEGRA_ARM_INT_DIST_SIZE SZ_4K | 32 | #define TEGRA_ARM_INT_DIST_SIZE SZ_4K |
33 | 33 | ||
34 | #define TEGRA_PRIMARY_ICTLR_BASE 0x60004000 | ||
35 | #define TEGRA_PRIMARY_ICTLR_SIZE SZ_64 | ||
36 | |||
37 | #define TEGRA_SECONDARY_ICTLR_BASE 0x60004100 | ||
38 | #define TEGRA_SECONDARY_ICTLR_SIZE SZ_64 | ||
39 | |||
40 | #define TEGRA_TERTIARY_ICTLR_BASE 0x60004200 | ||
41 | #define TEGRA_TERTIARY_ICTLR_SIZE SZ_64 | ||
42 | |||
43 | #define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300 | ||
44 | #define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64 | ||
45 | |||
46 | #define TEGRA_QUINARY_ICTLR_BASE 0x60004400 | ||
47 | #define TEGRA_QUINARY_ICTLR_SIZE SZ_64 | ||
48 | |||
49 | #define TEGRA_TMR1_BASE 0x60005000 | 34 | #define TEGRA_TMR1_BASE 0x60005000 |
50 | #define TEGRA_TMR1_SIZE SZ_8 | 35 | #define TEGRA_TMR1_SIZE SZ_8 |
51 | 36 | ||
diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c index 1593c4c8b7f0..3b9098d27ea5 100644 --- a/arch/arm/mach-tegra/irq.c +++ b/arch/arm/mach-tegra/irq.c | |||
@@ -30,43 +30,9 @@ | |||
30 | #include "board.h" | 30 | #include "board.h" |
31 | #include "iomap.h" | 31 | #include "iomap.h" |
32 | 32 | ||
33 | #define ICTLR_CPU_IEP_VFIQ 0x08 | ||
34 | #define ICTLR_CPU_IEP_FIR 0x14 | ||
35 | #define ICTLR_CPU_IEP_FIR_SET 0x18 | ||
36 | #define ICTLR_CPU_IEP_FIR_CLR 0x1c | ||
37 | |||
38 | #define ICTLR_CPU_IER 0x20 | ||
39 | #define ICTLR_CPU_IER_SET 0x24 | ||
40 | #define ICTLR_CPU_IER_CLR 0x28 | ||
41 | #define ICTLR_CPU_IEP_CLASS 0x2C | ||
42 | |||
43 | #define ICTLR_COP_IER 0x30 | ||
44 | #define ICTLR_COP_IER_SET 0x34 | ||
45 | #define ICTLR_COP_IER_CLR 0x38 | ||
46 | #define ICTLR_COP_IEP_CLASS 0x3c | ||
47 | |||
48 | #define FIRST_LEGACY_IRQ 32 | ||
49 | #define TEGRA_MAX_NUM_ICTLRS 5 | ||
50 | |||
51 | #define SGI_MASK 0xFFFF | 33 | #define SGI_MASK 0xFFFF |
52 | 34 | ||
53 | static int num_ictlrs; | ||
54 | |||
55 | static void __iomem *ictlr_reg_base[] = { | ||
56 | IO_ADDRESS(TEGRA_PRIMARY_ICTLR_BASE), | ||
57 | IO_ADDRESS(TEGRA_SECONDARY_ICTLR_BASE), | ||
58 | IO_ADDRESS(TEGRA_TERTIARY_ICTLR_BASE), | ||
59 | IO_ADDRESS(TEGRA_QUATERNARY_ICTLR_BASE), | ||
60 | IO_ADDRESS(TEGRA_QUINARY_ICTLR_BASE), | ||
61 | }; | ||
62 | |||
63 | #ifdef CONFIG_PM_SLEEP | 35 | #ifdef CONFIG_PM_SLEEP |
64 | static u32 cop_ier[TEGRA_MAX_NUM_ICTLRS]; | ||
65 | static u32 cop_iep[TEGRA_MAX_NUM_ICTLRS]; | ||
66 | static u32 cpu_ier[TEGRA_MAX_NUM_ICTLRS]; | ||
67 | static u32 cpu_iep[TEGRA_MAX_NUM_ICTLRS]; | ||
68 | |||
69 | static u32 ictlr_wake_mask[TEGRA_MAX_NUM_ICTLRS]; | ||
70 | static void __iomem *tegra_gic_cpu_base; | 36 | static void __iomem *tegra_gic_cpu_base; |
71 | #endif | 37 | #endif |
72 | 38 | ||
@@ -83,140 +49,7 @@ bool tegra_pending_sgi(void) | |||
83 | return false; | 49 | return false; |
84 | } | 50 | } |
85 | 51 | ||
86 | static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg) | ||
87 | { | ||
88 | void __iomem *base; | ||
89 | u32 mask; | ||
90 | |||
91 | BUG_ON(irq < FIRST_LEGACY_IRQ || | ||
92 | irq >= FIRST_LEGACY_IRQ + num_ictlrs * 32); | ||
93 | |||
94 | base = ictlr_reg_base[(irq - FIRST_LEGACY_IRQ) / 32]; | ||
95 | mask = BIT((irq - FIRST_LEGACY_IRQ) % 32); | ||
96 | |||
97 | __raw_writel(mask, base + reg); | ||
98 | } | ||
99 | |||
100 | static void tegra_mask(struct irq_data *d) | ||
101 | { | ||
102 | if (d->hwirq < FIRST_LEGACY_IRQ) | ||
103 | return; | ||
104 | |||
105 | tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IER_CLR); | ||
106 | } | ||
107 | |||
108 | static void tegra_unmask(struct irq_data *d) | ||
109 | { | ||
110 | if (d->hwirq < FIRST_LEGACY_IRQ) | ||
111 | return; | ||
112 | |||
113 | tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IER_SET); | ||
114 | } | ||
115 | |||
116 | static void tegra_ack(struct irq_data *d) | ||
117 | { | ||
118 | if (d->hwirq < FIRST_LEGACY_IRQ) | ||
119 | return; | ||
120 | |||
121 | tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_CLR); | ||
122 | } | ||
123 | |||
124 | static void tegra_eoi(struct irq_data *d) | ||
125 | { | ||
126 | if (d->hwirq < FIRST_LEGACY_IRQ) | ||
127 | return; | ||
128 | |||
129 | tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_CLR); | ||
130 | } | ||
131 | |||
132 | static int tegra_retrigger(struct irq_data *d) | ||
133 | { | ||
134 | if (d->hwirq < FIRST_LEGACY_IRQ) | ||
135 | return 0; | ||
136 | |||
137 | tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_SET); | ||
138 | |||
139 | return 1; | ||
140 | } | ||
141 | |||
142 | #ifdef CONFIG_PM_SLEEP | 52 | #ifdef CONFIG_PM_SLEEP |
143 | static int tegra_set_wake(struct irq_data *d, unsigned int enable) | ||
144 | { | ||
145 | u32 irq = d->hwirq; | ||
146 | u32 index, mask; | ||
147 | |||
148 | if (irq < FIRST_LEGACY_IRQ || | ||
149 | irq >= FIRST_LEGACY_IRQ + num_ictlrs * 32) | ||
150 | return -EINVAL; | ||
151 | |||
152 | index = ((irq - FIRST_LEGACY_IRQ) / 32); | ||
153 | mask = BIT((irq - FIRST_LEGACY_IRQ) % 32); | ||
154 | if (enable) | ||
155 | ictlr_wake_mask[index] |= mask; | ||
156 | else | ||
157 | ictlr_wake_mask[index] &= ~mask; | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
162 | static int tegra_legacy_irq_suspend(void) | ||
163 | { | ||
164 | unsigned long flags; | ||
165 | int i; | ||
166 | |||
167 | local_irq_save(flags); | ||
168 | for (i = 0; i < num_ictlrs; i++) { | ||
169 | void __iomem *ictlr = ictlr_reg_base[i]; | ||
170 | /* Save interrupt state */ | ||
171 | cpu_ier[i] = readl_relaxed(ictlr + ICTLR_CPU_IER); | ||
172 | cpu_iep[i] = readl_relaxed(ictlr + ICTLR_CPU_IEP_CLASS); | ||
173 | cop_ier[i] = readl_relaxed(ictlr + ICTLR_COP_IER); | ||
174 | cop_iep[i] = readl_relaxed(ictlr + ICTLR_COP_IEP_CLASS); | ||
175 | |||
176 | /* Disable COP interrupts */ | ||
177 | writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR); | ||
178 | |||
179 | /* Disable CPU interrupts */ | ||
180 | writel_relaxed(~0ul, ictlr + ICTLR_CPU_IER_CLR); | ||
181 | |||
182 | /* Enable the wakeup sources of ictlr */ | ||
183 | writel_relaxed(ictlr_wake_mask[i], ictlr + ICTLR_CPU_IER_SET); | ||
184 | } | ||
185 | local_irq_restore(flags); | ||
186 | |||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | static void tegra_legacy_irq_resume(void) | ||
191 | { | ||
192 | unsigned long flags; | ||
193 | int i; | ||
194 | |||
195 | local_irq_save(flags); | ||
196 | for (i = 0; i < num_ictlrs; i++) { | ||
197 | void __iomem *ictlr = ictlr_reg_base[i]; | ||
198 | writel_relaxed(cpu_iep[i], ictlr + ICTLR_CPU_IEP_CLASS); | ||
199 | writel_relaxed(~0ul, ictlr + ICTLR_CPU_IER_CLR); | ||
200 | writel_relaxed(cpu_ier[i], ictlr + ICTLR_CPU_IER_SET); | ||
201 | writel_relaxed(cop_iep[i], ictlr + ICTLR_COP_IEP_CLASS); | ||
202 | writel_relaxed(~0ul, ictlr + ICTLR_COP_IER_CLR); | ||
203 | writel_relaxed(cop_ier[i], ictlr + ICTLR_COP_IER_SET); | ||
204 | } | ||
205 | local_irq_restore(flags); | ||
206 | } | ||
207 | |||
208 | static struct syscore_ops tegra_legacy_irq_syscore_ops = { | ||
209 | .suspend = tegra_legacy_irq_suspend, | ||
210 | .resume = tegra_legacy_irq_resume, | ||
211 | }; | ||
212 | |||
213 | int tegra_legacy_irq_syscore_init(void) | ||
214 | { | ||
215 | register_syscore_ops(&tegra_legacy_irq_syscore_ops); | ||
216 | |||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static int tegra_gic_notifier(struct notifier_block *self, | 53 | static int tegra_gic_notifier(struct notifier_block *self, |
221 | unsigned long cmd, void *v) | 54 | unsigned long cmd, void *v) |
222 | { | 55 | { |
@@ -251,7 +84,6 @@ static void tegra114_gic_cpu_pm_registration(void) | |||
251 | cpu_pm_register_notifier(&tegra_gic_notifier_block); | 84 | cpu_pm_register_notifier(&tegra_gic_notifier_block); |
252 | } | 85 | } |
253 | #else | 86 | #else |
254 | #define tegra_set_wake NULL | ||
255 | static void tegra114_gic_cpu_pm_registration(void) { } | 87 | static void tegra114_gic_cpu_pm_registration(void) { } |
256 | #endif | 88 | #endif |
257 | 89 | ||
@@ -263,37 +95,8 @@ static const struct of_device_id tegra_ictlr_match[] __initconst = { | |||
263 | 95 | ||
264 | void __init tegra_init_irq(void) | 96 | void __init tegra_init_irq(void) |
265 | { | 97 | { |
266 | int i; | 98 | if (WARN_ON(!of_find_matching_node(NULL, tegra_ictlr_match))) |
267 | void __iomem *distbase; | 99 | pr_warn("Outdated DT detected, suspend/resume will NOT work\n"); |
268 | |||
269 | if (of_find_matching_node(NULL, tegra_ictlr_match)) | ||
270 | goto skip_extn_setup; | ||
271 | |||
272 | tegra_legacy_irq_syscore_init(); | ||
273 | |||
274 | distbase = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE); | ||
275 | num_ictlrs = readl_relaxed(distbase + GIC_DIST_CTR) & 0x1f; | ||
276 | |||
277 | if (num_ictlrs > ARRAY_SIZE(ictlr_reg_base)) { | ||
278 | WARN(1, "Too many (%d) interrupt controllers found. Maximum is %d.", | ||
279 | num_ictlrs, ARRAY_SIZE(ictlr_reg_base)); | ||
280 | num_ictlrs = ARRAY_SIZE(ictlr_reg_base); | ||
281 | } | ||
282 | |||
283 | for (i = 0; i < num_ictlrs; i++) { | ||
284 | void __iomem *ictlr = ictlr_reg_base[i]; | ||
285 | writel(~0, ictlr + ICTLR_CPU_IER_CLR); | ||
286 | writel(0, ictlr + ICTLR_CPU_IEP_CLASS); | ||
287 | } | ||
288 | |||
289 | gic_arch_extn.irq_ack = tegra_ack; | ||
290 | gic_arch_extn.irq_eoi = tegra_eoi; | ||
291 | gic_arch_extn.irq_mask = tegra_mask; | ||
292 | gic_arch_extn.irq_unmask = tegra_unmask; | ||
293 | gic_arch_extn.irq_retrigger = tegra_retrigger; | ||
294 | gic_arch_extn.irq_set_wake = tegra_set_wake; | ||
295 | gic_arch_extn.flags = IRQCHIP_MASK_ON_SUSPEND; | ||
296 | 100 | ||
297 | skip_extn_setup: | ||
298 | tegra114_gic_cpu_pm_registration(); | 101 | tegra114_gic_cpu_pm_registration(); |
299 | } | 102 | } |
diff --git a/arch/arm/mach-tegra/irq.h b/arch/arm/mach-tegra/irq.h index bc05ce5613fb..5142649bba05 100644 --- a/arch/arm/mach-tegra/irq.h +++ b/arch/arm/mach-tegra/irq.h | |||
@@ -19,10 +19,4 @@ | |||
19 | 19 | ||
20 | bool tegra_pending_sgi(void); | 20 | bool tegra_pending_sgi(void); |
21 | 21 | ||
22 | #ifdef CONFIG_PM_SLEEP | ||
23 | int tegra_legacy_irq_syscore_init(void); | ||
24 | #else | ||
25 | static inline int tegra_legacy_irq_syscore_init(void) { return 0; } | ||
26 | #endif | ||
27 | |||
28 | #endif | 22 | #endif |