hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/clocksource/timer-atlas7.c
....@@ -1,9 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * System timer for CSR SiRFprimaII
34 *
45 * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
5
- *
6
- * Licensed under GPLv2 or later.
76 */
87
98 #include <linux/kernel.h>
....@@ -160,29 +159,23 @@
160159 .resume = sirfsoc_clocksource_resume,
161160 };
162161
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;
174163
175164 static int sirfsoc_local_timer_starting_cpu(unsigned int cpu)
176165 {
177166 struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu);
178
- struct irqaction *action;
167
+ unsigned int irq;
168
+ const char *name;
179169
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
+ }
184177
185
- ce->irq = action->irq;
178
+ ce->irq = irq;
186179 ce->name = "local_timer";
187180 ce->features = CLOCK_EVT_FEAT_ONESHOT;
188181 ce->rating = 200;
....@@ -197,9 +190,9 @@
197190 ce->min_delta_ticks = 2;
198191 ce->cpumask = cpumask_of(cpu);
199192
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));
203196
204197 clockevents_register_device(ce);
205198 return 0;
....@@ -207,12 +200,14 @@
207200
208201 static int sirfsoc_local_timer_dying_cpu(unsigned int cpu)
209202 {
203
+ struct clock_event_device *ce = per_cpu_ptr(sirfsoc_clockevent, cpu);
204
+
210205 sirfsoc_timer_count_disable(1);
211206
212207 if (cpu == 0)
213
- remove_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq);
208
+ free_irq(sirfsoc_timer_irq, ce);
214209 else
215
- remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq);
210
+ free_irq(sirfsoc_timer1_irq, ce);
216211 return 0;
217212 }
218213
....@@ -269,14 +264,14 @@
269264 return -ENXIO;
270265 }
271266
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) {
274269 pr_err("No irq passed for timer0 via DT\n");
275270 return -EINVAL;
276271 }
277272
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) {
280275 pr_err("No irq passed for timer1 via DT\n");
281276 return -EINVAL;
282277 }