OSDN Git Service

clocksource/drivers/fttmr010: Set interrupt and shutdown
authorJoel Stanley <joel@jms.id.au>
Thu, 7 Nov 2019 09:42:16 +0000 (20:12 +1030)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Fri, 21 Feb 2020 08:28:38 +0000 (09:28 +0100)
In preparation for supporting the ast2600, pass the shutdown and
interrupt functions to the common init callback.

Reviewed-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20191107094218.13210-3-joel@jms.id.au
drivers/clocksource/timer-fttmr010.c

index c2d30eb..edb1d5f 100644 (file)
 #define TIMER_CR               (0x30)
 
 /*
+ * Control register set to clear for ast2600 only.
+ */
+#define AST2600_TIMER_CR_CLR   (0x3c)
+
+/*
  * Control register (TMC30) bit fields for fttmr010/gemini/moxart timers.
  */
 #define TIMER_1_CR_ENABLE      BIT(0)
@@ -163,6 +168,16 @@ static int fttmr010_timer_set_next_event(unsigned long cycles,
        return 0;
 }
 
+static int ast2600_timer_shutdown(struct clock_event_device *evt)
+{
+       struct fttmr010 *fttmr010 = to_fttmr010(evt);
+
+       /* Stop */
+       writel(fttmr010->t1_enable_val, fttmr010->base + AST2600_TIMER_CR_CLR);
+
+       return 0;
+}
+
 static int fttmr010_timer_shutdown(struct clock_event_device *evt)
 {
        struct fttmr010 *fttmr010 = to_fttmr010(evt);
@@ -244,7 +259,21 @@ static irqreturn_t fttmr010_timer_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
+static irqreturn_t ast2600_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = dev_id;
+       struct fttmr010 *fttmr010 = to_fttmr010(evt);
+
+       writel(0x1, fttmr010->base + TIMER_INTR_STATE);
+
+       evt->event_handler(evt);
+       return IRQ_HANDLED;
+}
+
+static int __init fttmr010_common_init(struct device_node *np,
+               bool is_aspeed,
+               int (*timer_shutdown)(struct clock_event_device *),
+               irq_handler_t irq_handler)
 {
        struct fttmr010 *fttmr010;
        int irq;
@@ -345,7 +374,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
                                     fttmr010->tick_rate);
        }
 
-       fttmr010->timer_shutdown = fttmr010_timer_shutdown;
+       fttmr010->timer_shutdown = timer_shutdown;
 
        /*
         * Setup clockevent timer (interrupt-driven) on timer 1.
@@ -354,7 +383,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
        writel(0, fttmr010->base + TIMER1_LOAD);
        writel(0, fttmr010->base + TIMER1_MATCH1);
        writel(0, fttmr010->base + TIMER1_MATCH2);
-       ret = request_irq(irq, fttmr010_timer_interrupt, IRQF_TIMER,
+       ret = request_irq(irq, irq_handler, IRQF_TIMER,
                          "FTTMR010-TIMER1", &fttmr010->clkevt);
        if (ret) {
                pr_err("FTTMR010-TIMER1 no IRQ\n");
@@ -401,14 +430,25 @@ out_disable_clock:
        return ret;
 }
 
+static __init int ast2600_timer_init(struct device_node *np)
+{
+       return fttmr010_common_init(np, true,
+                       ast2600_timer_shutdown,
+                       ast2600_timer_interrupt);
+}
+
 static __init int aspeed_timer_init(struct device_node *np)
 {
-       return fttmr010_common_init(np, true);
+       return fttmr010_common_init(np, true,
+                       fttmr010_timer_shutdown,
+                       fttmr010_timer_interrupt);
 }
 
 static __init int fttmr010_timer_init(struct device_node *np)
 {
-       return fttmr010_common_init(np, false);
+       return fttmr010_common_init(np, false,
+                       fttmr010_timer_shutdown,
+                       fttmr010_timer_interrupt);
 }
 
 TIMER_OF_DECLARE(fttmr010, "faraday,fttmr010", fttmr010_timer_init);
@@ -416,3 +456,4 @@ TIMER_OF_DECLARE(gemini, "cortina,gemini-timer", fttmr010_timer_init);
 TIMER_OF_DECLARE(moxart, "moxa,moxart-timer", fttmr010_timer_init);
 TIMER_OF_DECLARE(ast2400, "aspeed,ast2400-timer", aspeed_timer_init);
 TIMER_OF_DECLARE(ast2500, "aspeed,ast2500-timer", aspeed_timer_init);
+TIMER_OF_DECLARE(ast2600, "aspeed,ast2600-timer", ast2600_timer_init);