LoongArch: Implement constant timer shutdown interface
[platform/kernel/linux-starfive.git] / arch / loongarch / kernel / time.c
index 3064af9..e7015f7 100644 (file)
@@ -58,14 +58,16 @@ static int constant_set_state_oneshot(struct clock_event_device *evt)
        return 0;
 }
 
-static int constant_set_state_oneshot_stopped(struct clock_event_device *evt)
+static int constant_set_state_periodic(struct clock_event_device *evt)
 {
+       unsigned long period;
        unsigned long timer_config;
 
        raw_spin_lock(&state_lock);
 
-       timer_config = csr_read64(LOONGARCH_CSR_TCFG);
-       timer_config &= ~CSR_TCFG_EN;
+       period = const_clock_freq / HZ;
+       timer_config = period & CSR_TCFG_VAL;
+       timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN);
        csr_write64(timer_config, LOONGARCH_CSR_TCFG);
 
        raw_spin_unlock(&state_lock);
@@ -73,16 +75,14 @@ static int constant_set_state_oneshot_stopped(struct clock_event_device *evt)
        return 0;
 }
 
-static int constant_set_state_periodic(struct clock_event_device *evt)
+static int constant_set_state_shutdown(struct clock_event_device *evt)
 {
-       unsigned long period;
        unsigned long timer_config;
 
        raw_spin_lock(&state_lock);
 
-       period = const_clock_freq / HZ;
-       timer_config = period & CSR_TCFG_VAL;
-       timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN);
+       timer_config = csr_read64(LOONGARCH_CSR_TCFG);
+       timer_config &= ~CSR_TCFG_EN;
        csr_write64(timer_config, LOONGARCH_CSR_TCFG);
 
        raw_spin_unlock(&state_lock);
@@ -90,11 +90,6 @@ static int constant_set_state_periodic(struct clock_event_device *evt)
        return 0;
 }
 
-static int constant_set_state_shutdown(struct clock_event_device *evt)
-{
-       return 0;
-}
-
 static int constant_timer_next_event(unsigned long delta, struct clock_event_device *evt)
 {
        unsigned long timer_config;
@@ -161,7 +156,7 @@ int constant_clockevent_init(void)
        cd->rating = 320;
        cd->cpumask = cpumask_of(cpu);
        cd->set_state_oneshot = constant_set_state_oneshot;
-       cd->set_state_oneshot_stopped = constant_set_state_oneshot_stopped;
+       cd->set_state_oneshot_stopped = constant_set_state_shutdown;
        cd->set_state_periodic = constant_set_state_periodic;
        cd->set_state_shutdown = constant_set_state_shutdown;
        cd->set_next_event = constant_timer_next_event;