K3 SoCs have a timer compatible to the ones found on the AM335x SoCs. This patch adds support for these SoCs to the driver. The main difference is that on AM335x we do not have clk support and get the timer frequency from a SoC specific call, thus we have to play some ifdeffery to add clk support for K3 and still keep the SoC specific call to the AM335x code. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/clocksource/timer-ti-dm.c | 53 +++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c index 8473cf733d..eb658402f5 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -21,8 +21,8 @@ #include <clock.h> #include <init.h> #include <io.h> -#include <mach/omap/am33xx-silicon.h> #include <mach/omap/am33xx-clock.h> +#include <linux/clk.h> #include <stdio.h> @@ -65,10 +65,15 @@ static struct clocksource dmtimer_cs = { .priority = 70, }; +struct omap_dmtimer_data { + int (*get_clock)(struct device *dev); +}; + static int omap_dmtimer_probe(struct device *dev) { struct resource *iores; - u64 clk_speed; + int clk_speed; + const struct omap_dmtimer_data *data; /* one timer is enough */ if (base) @@ -79,8 +84,12 @@ static int omap_dmtimer_probe(struct device *dev) return PTR_ERR(iores); base = IOMEM(iores->start); - clk_speed = am33xx_get_osc_clock(); - clk_speed *= 1000; + data = device_get_match_data(dev); + + clk_speed = data->get_clock(dev); + if (clk_speed < 0) + return clk_speed; + dmtimer_cs.mult = clocksource_hz2mult(clk_speed, dmtimer_cs.shift); /* Enable counter */ @@ -89,10 +98,44 @@ static int omap_dmtimer_probe(struct device *dev) return init_clock(&dmtimer_cs); } +static int am335x_get_clock(struct device *dev) +{ + return am33xx_get_osc_clock() * 1000; +} + +static __maybe_unused struct omap_dmtimer_data am335x_data = { + .get_clock = am335x_get_clock, +}; + +static int k3_get_clock(struct device *dev) +{ + struct clk *clk; + + clk = clk_get(dev, NULL); + if (IS_ERR(clk)) + return dev_err_probe(dev, PTR_ERR(clk), "Cannot get clock\n"); + + return clk_get_rate(clk); +} + +static __maybe_unused struct omap_dmtimer_data k3_data = { + .get_clock = k3_get_clock, +}; + static __maybe_unused struct of_device_id omap_dmtimer_dt_ids[] = { +#ifdef CONFIG_ARCH_OMAP { .compatible = "ti,am335x-timer", - }, { + .data = &am335x_data, + }, +#endif +#ifdef CONFIG_ARCH_K3 + { + .compatible = "ti,am654-timer", + .data = &k3_data, + }, +#endif + { /* sentinel */ } }; -- 2.39.5