Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[linux-2.6-microblaze.git] / drivers / clocksource / arm_arch_timer.c
index 9a5464c..2204a44 100644 (file)
@@ -69,7 +69,11 @@ static enum arch_timer_ppi_nr arch_timer_uses_ppi = ARCH_TIMER_VIRT_PPI;
 static bool arch_timer_c3stop;
 static bool arch_timer_mem_use_virtual;
 static bool arch_counter_suspend_stop;
-static bool vdso_default = true;
+#ifdef CONFIG_GENERIC_GETTIMEOFDAY
+static enum vdso_clock_mode vdso_default = VDSO_CLOCKMODE_ARCHTIMER;
+#else
+static enum vdso_clock_mode vdso_default = VDSO_CLOCKMODE_NONE;
+#endif /* CONFIG_GENERIC_GETTIMEOFDAY */
 
 static cpumask_t evtstrm_available = CPU_MASK_NONE;
 static bool evtstrm_enable = IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM);
@@ -560,8 +564,8 @@ void arch_timer_enable_workaround(const struct arch_timer_erratum_workaround *wa
         * change both the default value and the vdso itself.
         */
        if (wa->read_cntvct_el0) {
-               clocksource_counter.archdata.vdso_direct = false;
-               vdso_default = false;
+               clocksource_counter.vdso_clock_mode = VDSO_CLOCKMODE_NONE;
+               vdso_default = VDSO_CLOCKMODE_NONE;
        }
 }
 
@@ -885,6 +889,17 @@ static int arch_timer_starting_cpu(unsigned int cpu)
        return 0;
 }
 
+static int validate_timer_rate(void)
+{
+       if (!arch_timer_rate)
+               return -EINVAL;
+
+       /* Arch timer frequency < 1MHz can cause trouble */
+       WARN_ON(arch_timer_rate < 1000000);
+
+       return 0;
+}
+
 /*
  * For historical reasons, when probing with DT we use whichever (non-zero)
  * rate was probed first, and don't verify that others match. If the first node
@@ -900,7 +915,7 @@ static void arch_timer_of_configure_rate(u32 rate, struct device_node *np)
                arch_timer_rate = rate;
 
        /* Check the timer frequency. */
-       if (arch_timer_rate == 0)
+       if (validate_timer_rate())
                pr_warn("frequency not available\n");
 }
 
@@ -979,7 +994,7 @@ static void __init arch_counter_register(unsigned type)
                }
 
                arch_timer_read_counter = rd;
-               clocksource_counter.archdata.vdso_direct = vdso_default;
+               clocksource_counter.vdso_clock_mode = vdso_default;
        } else {
                arch_timer_read_counter = arch_counter_get_cntvct_mem;
        }
@@ -1594,9 +1609,10 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table)
         * CNTFRQ value. This *must* be correct.
         */
        arch_timer_rate = arch_timer_get_cntfrq();
-       if (!arch_timer_rate) {
+       ret = validate_timer_rate();
+       if (ret) {
                pr_err(FW_BUG "frequency not available.\n");
-               return -EINVAL;
+               return ret;
        }
 
        arch_timer_uses_ppi = arch_timer_select_ppi();