hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/clocksource/timer-fttmr010.c
....@@ -38,6 +38,11 @@
3838 #define TIMER_CR (0x30)
3939
4040 /*
41
+ * Control register set to clear for ast2600 only.
42
+ */
43
+#define AST2600_TIMER_CR_CLR (0x3c)
44
+
45
+/*
4146 * Control register (TMC30) bit fields for fttmr010/gemini/moxart timers.
4247 */
4348 #define TIMER_1_CR_ENABLE BIT(0)
....@@ -97,6 +102,7 @@
97102 bool is_aspeed;
98103 u32 t1_enable_val;
99104 struct clock_event_device clkevt;
105
+ int (*timer_shutdown)(struct clock_event_device *evt);
100106 #ifdef CONFIG_ARM
101107 struct delay_timer delay_timer;
102108 #endif
....@@ -140,9 +146,7 @@
140146 u32 cr;
141147
142148 /* Stop */
143
- cr = readl(fttmr010->base + TIMER_CR);
144
- cr &= ~fttmr010->t1_enable_val;
145
- writel(cr, fttmr010->base + TIMER_CR);
149
+ fttmr010->timer_shutdown(evt);
146150
147151 if (fttmr010->is_aspeed) {
148152 /*
....@@ -160,6 +164,16 @@
160164 cr = readl(fttmr010->base + TIMER_CR);
161165 cr |= fttmr010->t1_enable_val;
162166 writel(cr, fttmr010->base + TIMER_CR);
167
+
168
+ return 0;
169
+}
170
+
171
+static int ast2600_timer_shutdown(struct clock_event_device *evt)
172
+{
173
+ struct fttmr010 *fttmr010 = to_fttmr010(evt);
174
+
175
+ /* Stop */
176
+ writel(fttmr010->t1_enable_val, fttmr010->base + AST2600_TIMER_CR_CLR);
163177
164178 return 0;
165179 }
....@@ -183,9 +197,7 @@
183197 u32 cr;
184198
185199 /* Stop */
186
- cr = readl(fttmr010->base + TIMER_CR);
187
- cr &= ~fttmr010->t1_enable_val;
188
- writel(cr, fttmr010->base + TIMER_CR);
200
+ fttmr010->timer_shutdown(evt);
189201
190202 /* Setup counter start from 0 or ~0 */
191203 writel(0, fttmr010->base + TIMER1_COUNT);
....@@ -211,9 +223,7 @@
211223 u32 cr;
212224
213225 /* Stop */
214
- cr = readl(fttmr010->base + TIMER_CR);
215
- cr &= ~fttmr010->t1_enable_val;
216
- writel(cr, fttmr010->base + TIMER_CR);
226
+ fttmr010->timer_shutdown(evt);
217227
218228 /* Setup timer to fire at 1/HZ intervals. */
219229 if (fttmr010->is_aspeed) {
....@@ -249,7 +259,21 @@
249259 return IRQ_HANDLED;
250260 }
251261
252
-static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
262
+static irqreturn_t ast2600_timer_interrupt(int irq, void *dev_id)
263
+{
264
+ struct clock_event_device *evt = dev_id;
265
+ struct fttmr010 *fttmr010 = to_fttmr010(evt);
266
+
267
+ writel(0x1, fttmr010->base + TIMER_INTR_STATE);
268
+
269
+ evt->event_handler(evt);
270
+ return IRQ_HANDLED;
271
+}
272
+
273
+static int __init fttmr010_common_init(struct device_node *np,
274
+ bool is_aspeed,
275
+ int (*timer_shutdown)(struct clock_event_device *),
276
+ irq_handler_t irq_handler)
253277 {
254278 struct fttmr010 *fttmr010;
255279 int irq;
....@@ -350,6 +374,8 @@
350374 fttmr010->tick_rate);
351375 }
352376
377
+ fttmr010->timer_shutdown = timer_shutdown;
378
+
353379 /*
354380 * Setup clockevent timer (interrupt-driven) on timer 1.
355381 */
....@@ -357,7 +383,7 @@
357383 writel(0, fttmr010->base + TIMER1_LOAD);
358384 writel(0, fttmr010->base + TIMER1_MATCH1);
359385 writel(0, fttmr010->base + TIMER1_MATCH2);
360
- ret = request_irq(irq, fttmr010_timer_interrupt, IRQF_TIMER,
386
+ ret = request_irq(irq, irq_handler, IRQF_TIMER,
361387 "FTTMR010-TIMER1", &fttmr010->clkevt);
362388 if (ret) {
363389 pr_err("FTTMR010-TIMER1 no IRQ\n");
....@@ -370,10 +396,10 @@
370396 fttmr010->clkevt.features = CLOCK_EVT_FEAT_PERIODIC |
371397 CLOCK_EVT_FEAT_ONESHOT;
372398 fttmr010->clkevt.set_next_event = fttmr010_timer_set_next_event;
373
- fttmr010->clkevt.set_state_shutdown = fttmr010_timer_shutdown;
399
+ fttmr010->clkevt.set_state_shutdown = fttmr010->timer_shutdown;
374400 fttmr010->clkevt.set_state_periodic = fttmr010_timer_set_periodic;
375401 fttmr010->clkevt.set_state_oneshot = fttmr010_timer_set_oneshot;
376
- fttmr010->clkevt.tick_resume = fttmr010_timer_shutdown;
402
+ fttmr010->clkevt.tick_resume = fttmr010->timer_shutdown;
377403 fttmr010->clkevt.cpumask = cpumask_of(0);
378404 fttmr010->clkevt.irq = irq;
379405 clockevents_config_and_register(&fttmr010->clkevt,
....@@ -404,14 +430,25 @@
404430 return ret;
405431 }
406432
433
+static __init int ast2600_timer_init(struct device_node *np)
434
+{
435
+ return fttmr010_common_init(np, true,
436
+ ast2600_timer_shutdown,
437
+ ast2600_timer_interrupt);
438
+}
439
+
407440 static __init int aspeed_timer_init(struct device_node *np)
408441 {
409
- return fttmr010_common_init(np, true);
442
+ return fttmr010_common_init(np, true,
443
+ fttmr010_timer_shutdown,
444
+ fttmr010_timer_interrupt);
410445 }
411446
412447 static __init int fttmr010_timer_init(struct device_node *np)
413448 {
414
- return fttmr010_common_init(np, false);
449
+ return fttmr010_common_init(np, false,
450
+ fttmr010_timer_shutdown,
451
+ fttmr010_timer_interrupt);
415452 }
416453
417454 TIMER_OF_DECLARE(fttmr010, "faraday,fttmr010", fttmr010_timer_init);
....@@ -419,3 +456,4 @@
419456 TIMER_OF_DECLARE(moxart, "moxa,moxart-timer", fttmr010_timer_init);
420457 TIMER_OF_DECLARE(ast2400, "aspeed,ast2400-timer", aspeed_timer_init);
421458 TIMER_OF_DECLARE(ast2500, "aspeed,ast2500-timer", aspeed_timer_init);
459
+TIMER_OF_DECLARE(ast2600, "aspeed,ast2600-timer", ast2600_timer_init);