.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * System timer for CSR SiRFprimaII |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. |
---|
5 | | - * |
---|
6 | | - * Licensed under GPLv2 or later. |
---|
7 | 6 | */ |
---|
8 | 7 | |
---|
9 | 8 | #include <linux/kernel.h> |
---|
.. | .. |
---|
160 | 159 | .resume = sirfsoc_clocksource_resume, |
---|
161 | 160 | }; |
---|
162 | 161 | |
---|
163 | | -static struct irqaction sirfsoc_timer_irq = { |
---|
164 | | - .name = "sirfsoc_timer0", |
---|
165 | | - .flags = IRQF_TIMER | IRQF_NOBALANCING, |
---|
166 | | - .handler = sirfsoc_timer_interrupt, |
---|
167 | | -}; |
---|
168 | | - |
---|
169 | | -static struct irqaction sirfsoc_timer1_irq = { |
---|
170 | | - .name = "sirfsoc_timer1", |
---|
171 | | - .flags = IRQF_TIMER | IRQF_NOBALANCING, |
---|
172 | | - .handler = sirfsoc_timer_interrupt, |
---|
173 | | -}; |
---|
| 162 | +static unsigned int sirfsoc_timer_irq, sirfsoc_timer1_irq; |
---|
174 | 163 | |
---|
175 | 164 | static int sirfsoc_local_timer_starting_cpu(unsigned int cpu) |
---|
176 | 165 | { |
---|
177 | 166 | struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu); |
---|
178 | | - struct irqaction *action; |
---|
| 167 | + unsigned int irq; |
---|
| 168 | + const char *name; |
---|
179 | 169 | |
---|
180 | | - if (cpu == 0) |
---|
181 | | - action = &sirfsoc_timer_irq; |
---|
182 | | - else |
---|
183 | | - action = &sirfsoc_timer1_irq; |
---|
| 170 | + if (cpu == 0) { |
---|
| 171 | + irq = sirfsoc_timer_irq; |
---|
| 172 | + name = "sirfsoc_timer0"; |
---|
| 173 | + } else { |
---|
| 174 | + irq = sirfsoc_timer1_irq; |
---|
| 175 | + name = "sirfsoc_timer1"; |
---|
| 176 | + } |
---|
184 | 177 | |
---|
185 | | - ce->irq = action->irq; |
---|
| 178 | + ce->irq = irq; |
---|
186 | 179 | ce->name = "local_timer"; |
---|
187 | 180 | ce->features = CLOCK_EVT_FEAT_ONESHOT; |
---|
188 | 181 | ce->rating = 200; |
---|
.. | .. |
---|
197 | 190 | ce->min_delta_ticks = 2; |
---|
198 | 191 | ce->cpumask = cpumask_of(cpu); |
---|
199 | 192 | |
---|
200 | | - action->dev_id = ce; |
---|
201 | | - BUG_ON(setup_irq(ce->irq, action)); |
---|
202 | | - irq_force_affinity(action->irq, cpumask_of(cpu)); |
---|
| 193 | + BUG_ON(request_irq(ce->irq, sirfsoc_timer_interrupt, |
---|
| 194 | + IRQF_TIMER | IRQF_NOBALANCING, name, ce)); |
---|
| 195 | + irq_force_affinity(ce->irq, cpumask_of(cpu)); |
---|
203 | 196 | |
---|
204 | 197 | clockevents_register_device(ce); |
---|
205 | 198 | return 0; |
---|
.. | .. |
---|
207 | 200 | |
---|
208 | 201 | static int sirfsoc_local_timer_dying_cpu(unsigned int cpu) |
---|
209 | 202 | { |
---|
| 203 | + struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu); |
---|
| 204 | + |
---|
210 | 205 | sirfsoc_timer_count_disable(1); |
---|
211 | 206 | |
---|
212 | 207 | if (cpu == 0) |
---|
213 | | - remove_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq); |
---|
| 208 | + free_irq(sirfsoc_timer_irq, ce); |
---|
214 | 209 | else |
---|
215 | | - remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq); |
---|
| 210 | + free_irq(sirfsoc_timer1_irq, ce); |
---|
216 | 211 | return 0; |
---|
217 | 212 | } |
---|
218 | 213 | |
---|
.. | .. |
---|
269 | 264 | return -ENXIO; |
---|
270 | 265 | } |
---|
271 | 266 | |
---|
272 | | - sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0); |
---|
273 | | - if (!sirfsoc_timer_irq.irq) { |
---|
| 267 | + sirfsoc_timer_irq = irq_of_parse_and_map(np, 0); |
---|
| 268 | + if (!sirfsoc_timer_irq) { |
---|
274 | 269 | pr_err("No irq passed for timer0 via DT\n"); |
---|
275 | 270 | return -EINVAL; |
---|
276 | 271 | } |
---|
277 | 272 | |
---|
278 | | - sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1); |
---|
279 | | - if (!sirfsoc_timer1_irq.irq) { |
---|
| 273 | + sirfsoc_timer1_irq = irq_of_parse_and_map(np, 1); |
---|
| 274 | + if (!sirfsoc_timer1_irq) { |
---|
280 | 275 | pr_err("No irq passed for timer1 via DT\n"); |
---|
281 | 276 | return -EINVAL; |
---|
282 | 277 | } |
---|