]> Git Repo - linux.git/commitdiff
clocksource/drivers/timer-ti-32k: Add support for initializing directly
authorTony Lindgren <[email protected]>
Thu, 7 May 2020 17:23:17 +0000 (10:23 -0700)
committerDaniel Lezcano <[email protected]>
Fri, 22 May 2020 22:01:04 +0000 (00:01 +0200)
Let's allow probing the 32k counter directly based on devicetree data to
prepare for dropping the related legacy platform code. Let's only do this
if the parent node is compatible with ti-sysc to make sure we have the
related devicetree data available.

Let's also show the 32k counter information before registering the
clocksource, now we see it after the clocksource information which is a
bit confusing.

Cc: [email protected]
Cc: [email protected]
Cc: Daniel Lezcano <[email protected]>
Cc: Grygorii Strashko <[email protected]>
Cc: Keerthy <[email protected]>
Cc: Lokesh Vutla <[email protected]>
Cc: Rob Herring <[email protected]>
Cc: Tero Kristo <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Tony Lindgren <[email protected]>
Signed-off-by: Daniel Lezcano <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
drivers/clocksource/timer-ti-32k.c

index abd5f158d6e2d7b9d84fbdaf91b3ac9fda0d1f7b..ae12bbf3d68cfcb04e615a5a738d617e67e31142 100644 (file)
@@ -24,6 +24,7 @@
  * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
  */
 
+#include <linux/clk.h>
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/sched_clock.h>
@@ -76,6 +77,49 @@ static u64 notrace omap_32k_read_sched_clock(void)
        return ti_32k_read_cycles(&ti_32k_timer.cs);
 }
 
+static void __init ti_32k_timer_enable_clock(struct device_node *np,
+                                            const char *name)
+{
+       struct clk *clock;
+       int error;
+
+       clock = of_clk_get_by_name(np->parent, name);
+       if (IS_ERR(clock)) {
+               /* Only some SoCs have a separate interface clock */
+               if (PTR_ERR(clock) == -EINVAL && !strncmp("ick", name, 3))
+                       return;
+
+               pr_warn("%s: could not get clock %s %li\n",
+                       __func__, name, PTR_ERR(clock));
+               return;
+       }
+
+       error = clk_prepare_enable(clock);
+       if (error) {
+               pr_warn("%s: could not enable %s: %i\n",
+                       __func__, name, error);
+               return;
+       }
+}
+
+static void __init ti_32k_timer_module_init(struct device_node *np,
+                                           void __iomem *base)
+{
+       void __iomem *sysc = base + 4;
+
+       if (!of_device_is_compatible(np->parent, "ti,sysc"))
+               return;
+
+       ti_32k_timer_enable_clock(np, "fck");
+       ti_32k_timer_enable_clock(np, "ick");
+
+       /*
+        * Force idle module as wkup domain is active with MPU.
+        * No need to tag the module disabled for ti-sysc probe.
+        */
+       writel_relaxed(0, sysc);
+}
+
 static int __init ti_32k_timer_init(struct device_node *np)
 {
        int ret;
@@ -90,6 +134,7 @@ static int __init ti_32k_timer_init(struct device_node *np)
                ti_32k_timer.cs.flags |= CLOCK_SOURCE_SUSPEND_NONSTOP;
 
        ti_32k_timer.counter = ti_32k_timer.base;
+       ti_32k_timer_module_init(np, ti_32k_timer.base);
 
        /*
         * 32k sync Counter IP register offsets vary between the highlander
@@ -104,6 +149,8 @@ static int __init ti_32k_timer_init(struct device_node *np)
        else
                ti_32k_timer.counter += OMAP2_32KSYNCNT_CR_OFF_LOW;
 
+       pr_info("OMAP clocksource: 32k_counter at 32768 Hz\n");
+
        ret = clocksource_register_hz(&ti_32k_timer.cs, 32768);
        if (ret) {
                pr_err("32k_counter: can't register clocksource\n");
@@ -111,7 +158,6 @@ static int __init ti_32k_timer_init(struct device_node *np)
        }
 
        sched_clock_register(omap_32k_read_sched_clock, 32, 32768);
-       pr_info("OMAP clocksource: 32k_counter at 32768 Hz\n");
 
        return 0;
 }
This page took 0.058463 seconds and 4 git commands to generate.