]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
clocksource/drivers/cadence-ttc: Use ttc driver as platform driver
authorRajan Vaja <rajan.vaja@xilinx.com>
Thu, 7 Nov 2019 10:36:28 +0000 (02:36 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jul 2023 06:37:05 +0000 (08:37 +0200)
[ Upstream commit f5ac896b6a23eb46681cdbef440c1d991b04e519 ]

Currently TTC driver is TIMER_OF_DECLARE type driver. Because of
that, TTC driver may be initialized before other clock drivers. If
TTC driver is dependent on that clock driver then initialization of
TTC driver will failed.

So use TTC driver as platform driver instead of using
TIMER_OF_DECLARE.

Signed-off-by: Rajan Vaja <rajan.vaja@xilinx.com>
Tested-by: Michal Simek <michal.simek@xilinx.com>
Acked-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/1573122988-18399-1-git-send-email-rajan.vaja@xilinx.com
Stable-dep-of: 8b5bf64c89c7 ("clocksource/drivers/cadence-ttc: Fix memory leak in ttc_timer_probe")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clocksource/timer-cadence-ttc.c

index 160bc6597de5bed39fa3c6d7eb179e1cc3b7a4e5..df5895e934636554fa5bad7675627d70530a8b63 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/of_irq.h>
 #include <linux/slab.h>
 #include <linux/sched_clock.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
 
 /*
  * This driver configures the 2 16/32-bit count-up timers as follows:
@@ -464,13 +466,7 @@ out_kfree:
        return err;
 }
 
-/**
- * ttc_timer_init - Initialize the timer
- *
- * Initializes the timer hardware and register the clock source and clock event
- * timers with Linux kernal timer framework
- */
-static int __init ttc_timer_init(struct device_node *timer)
+static int __init ttc_timer_probe(struct platform_device *pdev)
 {
        unsigned int irq;
        void __iomem *timer_baseaddr;
@@ -478,6 +474,7 @@ static int __init ttc_timer_init(struct device_node *timer)
        static int initialized;
        int clksel, ret;
        u32 timer_width = 16;
+       struct device_node *timer = pdev->dev.of_node;
 
        if (initialized)
                return 0;
@@ -532,4 +529,17 @@ static int __init ttc_timer_init(struct device_node *timer)
        return 0;
 }
 
-TIMER_OF_DECLARE(ttc, "cdns,ttc", ttc_timer_init);
+static const struct of_device_id ttc_timer_of_match[] = {
+       {.compatible = "cdns,ttc"},
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, ttc_timer_of_match);
+
+static struct platform_driver ttc_timer_driver = {
+       .driver = {
+               .name   = "cdns_ttc_timer",
+               .of_match_table = ttc_timer_of_match,
+       },
+};
+builtin_platform_driver_probe(ttc_timer_driver, ttc_timer_probe);