All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Shiyan <eagle.alexander923@gmail.com>
To: barebox@lists.infradead.org
Cc: Alexander Shiyan <eagle.alexander923@gmail.com>
Subject: [RFC 1/2] clocksource: Introduce a context storage for the clocksource structure
Date: Fri, 10 Jun 2022 11:56:31 +0300	[thread overview]
Message-ID: <20220610085633.21606-1-eagle.alexander923@gmail.com> (raw)

This patch adds a context entry for the clocksource structure.
This field can be used to store any private driver data, and to
distinguish between multiple driver instances for debugging purposes.

Signed-off-by: Alexander Shiyan <eagle.alexander923@gmail.com>
---
 arch/arm/mach-at91/at91rm9200_time.c        |  4 ++--
 arch/arm/mach-davinci/time.c                |  4 ++--
 arch/arm/mach-ep93xx/clocksource.c          |  4 ++--
 arch/arm/mach-mxs/clocksource-imx23.c       |  4 ++--
 arch/arm/mach-mxs/clocksource-imx28.c       |  4 ++--
 arch/arm/mach-pxa/clocksource.c             |  4 ++--
 arch/arm/mach-samsung/s3c-timer.c           |  4 ++--
 arch/arm/mach-tegra/tegra20-timer.c         |  4 ++--
 arch/arm/mach-versatile/core.c              |  4 ++--
 arch/mips/lib/csrc-r4k.c                    |  4 ++--
 arch/mips/mach-xburst/csrc-jz4750.c         |  4 ++--
 arch/openrisc/lib/clock.c                   |  4 ++--
 arch/powerpc/mach-mpc5xxx/time.c            |  4 ++--
 arch/powerpc/mach-mpc85xx/time.c            |  4 ++--
 arch/sandbox/board/clock.c                  |  4 ++--
 common/clock.c                              | 18 +++++++++++-------
 drivers/clocksource/amba-sp804.c            |  4 ++--
 drivers/clocksource/arm_architected_timer.c |  4 ++--
 drivers/clocksource/arm_global_timer.c      |  4 ++--
 drivers/clocksource/arm_smp_twd.c           |  4 ++--
 drivers/clocksource/armv7m_systick.c        |  4 ++--
 drivers/clocksource/bcm2835.c               |  4 ++--
 drivers/clocksource/clps711x.c              |  4 ++--
 drivers/clocksource/digic.c                 |  4 ++--
 drivers/clocksource/dw_apb_timer.c          |  4 ++--
 drivers/clocksource/efi.c                   |  4 ++--
 drivers/clocksource/efi_x86.c               |  4 ++--
 drivers/clocksource/kvx_timer.c             |  4 ++--
 drivers/clocksource/mvebu.c                 |  4 ++--
 drivers/clocksource/nomadik.c               |  4 ++--
 drivers/clocksource/orion.c                 |  4 ++--
 drivers/clocksource/rk_timer.c              |  4 ++--
 drivers/clocksource/timer-atmel-pit.c       |  4 ++--
 drivers/clocksource/timer-clint.c           |  4 ++--
 drivers/clocksource/timer-imx-gpt.c         |  4 ++--
 drivers/clocksource/timer-riscv.c           |  6 +++---
 drivers/clocksource/timer-stm32.c           |  4 ++--
 drivers/clocksource/timer-ti-32k.c          |  4 ++--
 drivers/clocksource/timer-ti-dm.c           |  4 ++--
 drivers/clocksource/uemd.c                  |  4 ++--
 include/clock.h                             |  7 ++++---
 41 files changed, 94 insertions(+), 89 deletions(-)

diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c
index 110d770881..80d4d7d35e 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -17,7 +17,7 @@ static void __iomem *st = IOMEM(AT91RM9200_BASE_ST);
  * the updates as seen by the CPU don't seem to be strictly monotonic.
  * Waiting until we read the same value twice avoids glitching.
  */
-static uint64_t at91rm9200_clocksource_read(void)
+static uint64_t at91rm9200_clocksource_read(void *ctx)
 {
 	unsigned long x1, x2;
 
@@ -48,7 +48,7 @@ static int clocksource_init (void)
 
 	cs.mult = clocksource_hz2mult(AT91_SLOW_CLOCK, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 core_initcall(clocksource_init);
 
diff --git a/arch/arm/mach-davinci/time.c b/arch/arm/mach-davinci/time.c
index c54e49470b..ba6737e6ba 100644
--- a/arch/arm/mach-davinci/time.c
+++ b/arch/arm/mach-davinci/time.c
@@ -88,7 +88,7 @@ static struct timer_s timers[] = {
 
 static struct timer_s *t = &timers[0];
 
-static uint64_t davinci_cs_read(void)
+static uint64_t davinci_cs_read(void *ctx)
 {
 	return (uint64_t)__raw_readl(t->base + t->tim_off);
 }
@@ -152,7 +152,7 @@ static int clocksource_init(void)
 	clocks_calc_mult_shift(&davinci_cs.mult, &davinci_cs.shift,
 		DAVINCI_TIMER_CLOCK, NSEC_PER_SEC, 10);
 
-	init_clock(&davinci_cs);
+	init_clock(&davinci_cs, NULL);
 
 	timer_init(IOMEM(DAVINCI_TIMER0_BASE));
 	timer_init(IOMEM(DAVINCI_TIMER1_BASE));
diff --git a/arch/arm/mach-ep93xx/clocksource.c b/arch/arm/mach-ep93xx/clocksource.c
index e2a3a39780..1a36e30fc2 100644
--- a/arch/arm/mach-ep93xx/clocksource.c
+++ b/arch/arm/mach-ep93xx/clocksource.c
@@ -26,7 +26,7 @@
 
 #define TIMER_FREQ		508469
 
-static uint64_t ep93xx_clocksource_read(void)
+static uint64_t ep93xx_clocksource_read(void *ctx)
 {
 	struct timer_regs *timer = (struct timer_regs *)TIMER_BASE;
 
@@ -57,7 +57,7 @@ static int clocksource_init(void)
 
 	cs.mult = clocksource_hz2mult(TIMER_FREQ, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/arch/arm/mach-mxs/clocksource-imx23.c b/arch/arm/mach-mxs/clocksource-imx23.c
index ba5aad9f30..c4692a1bf4 100644
--- a/arch/arm/mach-mxs/clocksource-imx23.c
+++ b/arch/arm/mach-mxs/clocksource-imx23.c
@@ -24,7 +24,7 @@ static const unsigned long timer_base = IMX_TIM1_BASE;
 
 #define CLOCK_TICK_RATE (32000)
 
-static uint64_t imx23_clocksource_read(void)
+static uint64_t imx23_clocksource_read(void *ctx)
 {
 	/* only the upper bits are the valid */
 	return ~(readl(timer_base + TIMCOUNT1) >> 16);
@@ -58,7 +58,7 @@ static int clocksource_init(void)
 
 	writel(TIMCTRL_UPDATE | TIMCTRL_RELOAD | TIMCTRL_PRESCALE(0) | TIMCTRL_SELECT(8), timer_base + TIMCTRL1);
 	cs.mult = clocksource_hz2mult(CLOCK_TICK_RATE/*imx_get_xclk()*/, cs.shift);
-	init_clock(&cs);
+	init_clock(&cs, NULL);
 
 	clock_register_client(&imx23_clock_notifier);
 	return 0;
diff --git a/arch/arm/mach-mxs/clocksource-imx28.c b/arch/arm/mach-mxs/clocksource-imx28.c
index 65d8155ad2..0d7d718191 100644
--- a/arch/arm/mach-mxs/clocksource-imx28.c
+++ b/arch/arm/mach-mxs/clocksource-imx28.c
@@ -30,7 +30,7 @@ static const void __iomem * timer_base = (void *)IMX_TIM1_BASE;
 /* we are using the 32 kHz reference */
 #define CLOCK_TICK_RATE 32000
 
-static uint64_t imx28_clocksource_read(void)
+static uint64_t imx28_clocksource_read(void *ctx)
 {
 	return ~(readl(timer_base + TIMCOUNT1));
 }
@@ -56,7 +56,7 @@ static int imx28_clocksource_init(void)
 			TIMCTRL_SELECT(0xb), timer_base + TIMCTRL1);
 	imx28_cs.mult = clocksource_hz2mult(CLOCK_TICK_RATE, imx28_cs.shift);
 
-	return init_clock(&imx28_cs);
+	return init_clock(&imx28_cs, NULL);
 }
 
 core_initcall(imx28_clocksource_init);
diff --git a/arch/arm/mach-pxa/clocksource.c b/arch/arm/mach-pxa/clocksource.c
index 3bc95827d8..bafa74cc4b 100644
--- a/arch/arm/mach-pxa/clocksource.c
+++ b/arch/arm/mach-pxa/clocksource.c
@@ -19,7 +19,7 @@
 
 #define OSCR	0x40A00010
 
-static uint64_t pxa_clocksource_read(void)
+static uint64_t pxa_clocksource_read(void *ctx)
 {
 	return readl(OSCR);
 }
@@ -35,7 +35,7 @@ static int clocksource_init(void)
 {
 	cs.mult = clocksource_hz2mult(3250000, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/arch/arm/mach-samsung/s3c-timer.c b/arch/arm/mach-samsung/s3c-timer.c
index 38bcebc7c4..de70172c35 100644
--- a/arch/arm/mach-samsung/s3c-timer.c
+++ b/arch/arm/mach-samsung/s3c-timer.c
@@ -91,7 +91,7 @@ static void s3c_timer_start(void)
 	writel(tcon, S3C_TCON);
 }
 
-static uint64_t s3c_clocksource_read(void)
+static uint64_t s3c_clocksource_read(void *ctx)
 {
 	/* note: its a down counter */
 	return max - readl(S3C_TCNTO4);
@@ -114,6 +114,6 @@ static int s3c_clk_src_init(void)
 
 	cs.mult = clocksource_hz2mult(s3c_get_t4_clk(), cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 core_initcall(s3c_clk_src_init);
diff --git a/arch/arm/mach-tegra/tegra20-timer.c b/arch/arm/mach-tegra/tegra20-timer.c
index 8ca8cb24fa..d1686cc034 100644
--- a/arch/arm/mach-tegra/tegra20-timer.c
+++ b/arch/arm/mach-tegra/tegra20-timer.c
@@ -33,7 +33,7 @@
 
 static void __iomem *timer_base;
 
-static uint64_t tegra20_timer_cs_read(void)
+static uint64_t tegra20_timer_cs_read(void *ctx)
 {
 	return readl(timer_base + TIMERUS_CNTR_1US);
 }
@@ -88,7 +88,7 @@ static int tegra20_timer_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(1000000, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static __maybe_unused struct of_device_id tegra20_timer_dt_ids[] = {
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c
index 9a2a9cad80..2f457b5457 100644
--- a/arch/arm/mach-versatile/core.c
+++ b/arch/arm/mach-versatile/core.c
@@ -83,7 +83,7 @@ EXPORT_SYMBOL(clk_disable);
 #define TIMER2_BASE (VERSATILE_TIMER2_3_BASE)
 #define TIMER3_BASE ((VERSATILE_TIMER2_3_BASE) + 0x20)
 
-static uint64_t vpb_clocksource_read(void)
+static uint64_t vpb_clocksource_read(void *ctx)
 {
 	return ~readl(TIMER0_BASE + TIMER_VALUE);
 }
@@ -129,7 +129,7 @@ static int vpb_clocksource_init(void)
 	versatile_timer_init();
 	vpb_cs.mult = clocksource_hz2mult(TIMER_FREQ, vpb_cs.shift);
 
-	return init_clock(&vpb_cs);
+	return init_clock(&vpb_cs, NULL);
 }
 
 core_initcall(vpb_clocksource_init);
diff --git a/arch/mips/lib/csrc-r4k.c b/arch/mips/lib/csrc-r4k.c
index 35fba3a29c..d77e57e087 100644
--- a/arch/mips/lib/csrc-r4k.c
+++ b/arch/mips/lib/csrc-r4k.c
@@ -15,7 +15,7 @@
 #include <io.h>
 #include <asm/mipsregs.h>
 
-static uint64_t c0_hpt_read(void)
+static uint64_t c0_hpt_read(void *ctx)
 {
 	return read_c0_count();
 }
@@ -48,6 +48,6 @@ static int clocksource_init(void)
 	clocks_calc_mult_shift(&cs.mult, &cs.shift,
 		mips_hpt_frequency, NSEC_PER_SEC, 10);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 postcore_initcall(clocksource_init);
diff --git a/arch/mips/mach-xburst/csrc-jz4750.c b/arch/mips/mach-xburst/csrc-jz4750.c
index 43135ac498..c90982761a 100644
--- a/arch/mips/mach-xburst/csrc-jz4750.c
+++ b/arch/mips/mach-xburst/csrc-jz4750.c
@@ -15,7 +15,7 @@
 
 #define JZ_TIMER_CLOCK 24000000
 
-static uint64_t jz4750_cs_read(void)
+static uint64_t jz4750_cs_read(void *ctx)
 {
 	return (uint64_t)__raw_readl((void *)TCU_OSTCNT);
 }
@@ -31,7 +31,7 @@ static int clocksource_init(void)
 	clocks_calc_mult_shift(&jz4750_cs.mult, &jz4750_cs.shift,
 		JZ_TIMER_CLOCK, NSEC_PER_SEC, 10);
 
-	init_clock(&jz4750_cs);
+	init_clock(&jz4750_cs, NULL);
 
 	__raw_writel(TCU_OSTCSR_PRESCALE1 | TCU_OSTCSR_EXT_EN,
 		(void *)TCU_OSTCSR);
diff --git a/arch/openrisc/lib/clock.c b/arch/openrisc/lib/clock.c
index 651b163f13..d21ef243a7 100644
--- a/arch/openrisc/lib/clock.c
+++ b/arch/openrisc/lib/clock.c
@@ -19,7 +19,7 @@
 #include <asm/system.h>
 #include <asm/openrisc_exc.h>
 
-static uint64_t openrisc_clocksource_read(void)
+static uint64_t openrisc_clocksource_read(void *ctx)
 {
 	return (uint64_t)(mfspr(SPR_TTCR));
 }
@@ -36,7 +36,7 @@ static int clocksource_init(void)
 	mtspr(SPR_TTMR, SPR_TTMR_CR | 0xFFFFFF);
 	cs.mult = clocksource_hz2mult(OPENRISC_TIMER_FREQ, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/arch/powerpc/mach-mpc5xxx/time.c b/arch/powerpc/mach-mpc5xxx/time.c
index d690d50f0d..5fc51e40d1 100644
--- a/arch/powerpc/mach-mpc5xxx/time.c
+++ b/arch/powerpc/mach-mpc5xxx/time.c
@@ -20,7 +20,7 @@
 #include <mach/clock.h>
 #include <asm/common.h>
 
-static uint64_t ppc_clocksource_read(void)
+static uint64_t ppc_clocksource_read(void *ctx)
 {
 	return get_ticks();
 }
@@ -39,7 +39,7 @@ static int clocksource_init(void)
 
 	cs.mult = clocksource_hz2mult(get_timebase_clock(), cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/arch/powerpc/mach-mpc85xx/time.c b/arch/powerpc/mach-mpc85xx/time.c
index 5981995ac2..08ae1a4009 100644
--- a/arch/powerpc/mach-mpc85xx/time.c
+++ b/arch/powerpc/mach-mpc85xx/time.c
@@ -20,7 +20,7 @@
 #include <init.h>
 #include <mach/clock.h>
 
-static uint64_t ppc_clocksource_read(void)
+static uint64_t ppc_clocksource_read(void *ctx)
 {
 	return get_ticks();
 }
@@ -39,7 +39,7 @@ static int clocksource_init(void)
 	clocks_calc_mult_shift(&cs.mult, &cs.shift,
 				fsl_get_timebase_clock(), NSEC_PER_SEC, 10);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/arch/sandbox/board/clock.c b/arch/sandbox/board/clock.c
index 1787fb5786..1b3d216dd1 100644
--- a/arch/sandbox/board/clock.c
+++ b/arch/sandbox/board/clock.c
@@ -19,7 +19,7 @@
 #include <clock.h>
 #include <mach/linux.h>
 
-static uint64_t linux_clocksource_read(void)
+static uint64_t linux_clocksource_read(void *ctx)
 {
 	return linux_get_time();
 }
@@ -35,7 +35,7 @@ static int clocksource_init (void)
 {
 	cs.mult = clocksource_hz2mult(1000 * 1000 * 1000, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 core_initcall(clocksource_init);
diff --git a/common/clock.c b/common/clock.c
index b300e5798a..b7da0c0f0b 100644
--- a/common/clock.c
+++ b/common/clock.c
@@ -17,7 +17,7 @@
 
 static uint64_t time_ns;
 
-static uint64_t dummy_read(void)
+static uint64_t dummy_read(void *ctx)
 {
 	static uint64_t dummy_counter;
 
@@ -56,7 +56,7 @@ uint64_t get_time_ns(void)
 	uint64_t ns_offset;
 
 	/* read clocksource: */
-	cycle_now = cs->read() & cs->mask;
+	cycle_now = cs->read(cs->ctx) & cs->mask;
 
 	/* calculate the delta since the last call: */
 	cycle_delta = (cycle_now - cs->cycle_last) & cs->mask;
@@ -203,10 +203,12 @@ void mdelay_non_interruptible(unsigned long msecs)
 }
 EXPORT_SYMBOL(mdelay_non_interruptible);
 
-int init_clock(struct clocksource *cs)
+int init_clock(struct clocksource *cs, void *ctx)
 {
-	if (current_clock && cs->priority <= current_clock->priority)
-		return 0;
+	if (cs->ctx)
+		return -EBUSY;
+
+	cs->ctx = ctx;
 
 	if (cs->init) {
 		int ret;
@@ -221,8 +223,10 @@ int init_clock(struct clocksource *cs)
 	 * before barebox started, we only care about the time spent in barebox
 	 * thus we must discard the clocksource cycles up to this exact moment:
 	 */
-	cs->cycle_last = cs->read() & cs->mask;
-	current_clock = cs;
+	cs->cycle_last = cs->read(cs->ctx) & cs->mask;
+
+	if (!current_clock || (cs->priority > current_clock->priority))
+		current_clock = cs;
 
 	return 0;
 }
diff --git a/drivers/clocksource/amba-sp804.c b/drivers/clocksource/amba-sp804.c
index fcb2b0254b..4c8387bf4b 100644
--- a/drivers/clocksource/amba-sp804.c
+++ b/drivers/clocksource/amba-sp804.c
@@ -17,7 +17,7 @@
 static __iomem void *sp804_base;
 static struct clk *sp804_clk;
 
-static uint64_t sp804_read(void)
+static uint64_t sp804_read(void *ctx)
 {
 	return ~readl(sp804_base + TIMER_VALUE);
 }
@@ -66,7 +66,7 @@ static int sp804_probe(struct amba_device *dev, const struct amba_id *id)
 
 	sp804_clksrc.mult = clocksource_hz2mult(tick_rate, sp804_clksrc.shift);
 
-	return init_clock(&sp804_clksrc);
+	return init_clock(&sp804_clksrc, NULL);
 }
 
 static struct amba_id sp804_ids[] = {
diff --git a/drivers/clocksource/arm_architected_timer.c b/drivers/clocksource/arm_architected_timer.c
index d5948fe948..b92c782a0a 100644
--- a/drivers/clocksource/arm_architected_timer.c
+++ b/drivers/clocksource/arm_architected_timer.c
@@ -10,7 +10,7 @@
 #include <io.h>
 #include <asm/system.h>
 
-static uint64_t arm_arch_clocksource_read(void)
+static uint64_t arm_arch_clocksource_read(void *ctx)
 {
 	return get_cntpct();
 }
@@ -26,7 +26,7 @@ static int arm_arch_timer_probe(struct device_d *dev)
 {
 	cs.mult = clocksource_hz2mult(get_cntfrq(), cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static struct of_device_id arm_arch_timer_dt_ids[] = {
diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c
index 65bfca3558..6e2fae9ba4 100644
--- a/drivers/clocksource/arm_global_timer.c
+++ b/drivers/clocksource/arm_global_timer.c
@@ -37,7 +37,7 @@ static void __iomem *gt_base;
  *  different to the 32-bit upper value read previously, go back to step 2.
  *  Otherwise the 64-bit timer counter value is correct.
  */
-static uint64_t arm_global_clocksource_read(void)
+static uint64_t arm_global_clocksource_read(void *ctx)
 {
 	uint64_t counter;
 	uint32_t lower;
@@ -96,7 +96,7 @@ static int arm_global_timer_probe(struct device_d *dev)
 	/* enables timer on all the cores */
 	writel(GT_CONTROL_TIMER_ENABLE, gt_base + GT_CONTROL);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static struct of_device_id arm_global_timer_dt_ids[] = {
diff --git a/drivers/clocksource/arm_smp_twd.c b/drivers/clocksource/arm_smp_twd.c
index 1ad754bb2b..dabaaa60c5 100644
--- a/drivers/clocksource/arm_smp_twd.c
+++ b/drivers/clocksource/arm_smp_twd.c
@@ -26,7 +26,7 @@
 static __iomem void *twd_base;
 static struct clk *twd_clk;
 
-static uint64_t smp_twd_read(void)
+static uint64_t smp_twd_read(void *ctx)
 {
 	return ~readl(twd_base + TWD_TIMER_COUNTER);
 }
@@ -88,7 +88,7 @@ static int smp_twd_probe(struct device_d *dev)
 
 	smp_twd_clksrc.mult = clocksource_hz2mult(tick_rate, smp_twd_clksrc.shift);
 
-	return init_clock(&smp_twd_clksrc);
+	return init_clock(&smp_twd_clksrc, NULL);
 }
 
 static __maybe_unused struct of_device_id smp_twd_compatible[] = {
diff --git a/drivers/clocksource/armv7m_systick.c b/drivers/clocksource/armv7m_systick.c
index 16d89c23bd..8e380e99fa 100644
--- a/drivers/clocksource/armv7m_systick.c
+++ b/drivers/clocksource/armv7m_systick.c
@@ -25,7 +25,7 @@
 
 static __iomem void *systick_base;
 
-static u64 armv7m_systick_clocksource_read(void)
+static u64 armv7m_systick_clocksource_read(void *ctx)
 {
         return SYSTICK_LOAD_RELOAD_MASK - readl(systick_base + SYST_CVR);
 }
@@ -72,7 +72,7 @@ static int armv7m_systick_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(rate, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static struct of_device_id armv7m_systick_dt_ids[] = {
diff --git a/drivers/clocksource/bcm2835.c b/drivers/clocksource/bcm2835.c
index d84341fc40..4dfb68b52a 100644
--- a/drivers/clocksource/bcm2835.c
+++ b/drivers/clocksource/bcm2835.c
@@ -20,7 +20,7 @@
 
 static __iomem void *stc_base;
 
-static uint64_t stc_read_cycles(void)
+static uint64_t stc_read_cycles(void *ctx)
 {
 	return readl(stc_base + ST_CLO);
 }
@@ -69,7 +69,7 @@ static int bcm2835_cs_probe(struct device_d *dev)
 
 	clocks_calc_mult_shift(&bcm2835_stc.mult, &bcm2835_stc.shift, rate, NSEC_PER_SEC, 60);
 
-	return init_clock(&bcm2835_stc);
+	return init_clock(&bcm2835_stc, NULL);
 }
 
 static __maybe_unused struct of_device_id bcm2835_cs_dt_ids[] = {
diff --git a/drivers/clocksource/clps711x.c b/drivers/clocksource/clps711x.c
index 1fe7f6c891..cd1de1ec32 100644
--- a/drivers/clocksource/clps711x.c
+++ b/drivers/clocksource/clps711x.c
@@ -11,7 +11,7 @@
 
 static __iomem void *clps711x_timer_base;
 
-static uint64_t clps711x_cs_read(void)
+static uint64_t clps711x_cs_read(void *ctx)
 {
 	return ~readw(clps711x_timer_base);
 }
@@ -43,7 +43,7 @@ static int clps711x_cs_probe(struct device_d *dev)
 	clocks_calc_mult_shift(&clps711x_cs.mult, &clps711x_cs.shift, rate,
 			       NSEC_PER_SEC, 10);
 
-	return init_clock(&clps711x_cs);
+	return init_clock(&clps711x_cs, NULL);
 }
 
 static __maybe_unused struct of_device_id clps711x_timer_dt_ids[] = {
diff --git a/drivers/clocksource/digic.c b/drivers/clocksource/digic.c
index 234985aece..3ddf34bdfa 100644
--- a/drivers/clocksource/digic.c
+++ b/drivers/clocksource/digic.c
@@ -18,7 +18,7 @@
 
 static void __iomem *timer_base;
 
-static uint64_t digic_cs_read(void)
+static uint64_t digic_cs_read(void *ctx)
 {
 	return (uint64_t)(0xffff - readl(timer_base + DIGIC_TIMER_VALUE));
 }
@@ -56,7 +56,7 @@ static int digic_timer_probe(struct device_d *dev)
 	/* max counter value */
 	writel(0x0000ffff, timer_base + 0x08);
 
-	init_clock(&digic_cs);
+	init_clock(&digic_cs, NULL);
 
 	/* enable timer */
 	writel(0x00000001, timer_base + DIGIC_TIMER_CONTROL);
diff --git a/drivers/clocksource/dw_apb_timer.c b/drivers/clocksource/dw_apb_timer.c
index 251089cf7e..69451a8b13 100644
--- a/drivers/clocksource/dw_apb_timer.c
+++ b/drivers/clocksource/dw_apb_timer.c
@@ -84,7 +84,7 @@ static int dw_apb_clocksource_start(struct clocksource *clksrc)
 	return 0;
 }
 
-static uint64_t dw_apb_clocksource_read(void)
+static uint64_t dw_apb_clocksource_read(void *ctx)
 {
 	return (uint64_t) ~apbt_readl(&timer, APBTMR_N_CURRENT_VALUE);
 }
@@ -128,7 +128,7 @@ static int dw_apb_timer_probe(struct device_d *dev)
 
 	dw_apb_clksrc.mult = clocksource_hz2mult(clk_freq, dw_apb_clksrc.shift);
 
-	return init_clock(&dw_apb_clksrc);
+	return init_clock(&dw_apb_clksrc, NULL);
 }
 
 static struct of_device_id dw_apb_timer_dt_ids[] = {
diff --git a/drivers/clocksource/efi.c b/drivers/clocksource/efi.c
index 9df5226573..0556ef63d1 100644
--- a/drivers/clocksource/efi.c
+++ b/drivers/clocksource/efi.c
@@ -14,7 +14,7 @@
 static uint64_t ticks = 1;
 static void *efi_cs_evt;
 
-static uint64_t efi_cs_read(void)
+static uint64_t efi_cs_read(void *ctx)
 {
 	return ticks;
 }
@@ -98,7 +98,7 @@ static struct clocksource efi_cs = {
 
 static int efi_cs_probe(struct device_d *dev)
 {
-	return init_clock(&efi_cs);
+	return init_clock(&efi_cs, NULL);
 }
 
 static struct driver_d efi_cs_driver = {
diff --git a/drivers/clocksource/efi_x86.c b/drivers/clocksource/efi_x86.c
index c9b6c44a1e..f66c4764d3 100644
--- a/drivers/clocksource/efi_x86.c
+++ b/drivers/clocksource/efi_x86.c
@@ -40,7 +40,7 @@ static uint64_t ticks_freq(void)
 	return (ticks_end - ticks_start) * 1000;
 }
 
-static uint64_t efi_x86_cs_read(void)
+static uint64_t efi_x86_cs_read(void *ctx)
 {
 	return 1000 * 1000 * ticks_read() / freq;
 }
@@ -64,7 +64,7 @@ static struct clocksource efi_x86_cs = {
 
 static int efi_x86_cs_probe(struct device_d *dev)
 {
-	return init_clock(&efi_x86_cs);
+	return init_clock(&efi_x86_cs, NULL);
 }
 
 static struct driver_d efi_x86_cs_driver = {
diff --git a/drivers/clocksource/kvx_timer.c b/drivers/clocksource/kvx_timer.c
index 259755eacd..ff255e7098 100644
--- a/drivers/clocksource/kvx_timer.c
+++ b/drivers/clocksource/kvx_timer.c
@@ -12,7 +12,7 @@
 
 #include <asm/sfr.h>
 
-static uint64_t kvx_pm_read(void)
+static uint64_t kvx_pm_read(void *ctx)
 {
 	return kvx_sfr_get(PM0);
 }
@@ -42,7 +42,7 @@ static int kvx_timer_probe(struct device_d *dev)
 	/* Init clocksource */
 	kvx_clksrc.mult = clocksource_hz2mult(clk_freq, kvx_clksrc.shift);
 
-	return init_clock(&kvx_clksrc);
+	return init_clock(&kvx_clksrc, NULL);
 }
 
 static struct of_device_id kvx_timer_dt_ids[] = {
diff --git a/drivers/clocksource/mvebu.c b/drivers/clocksource/mvebu.c
index d3214955dc..753342edbd 100644
--- a/drivers/clocksource/mvebu.c
+++ b/drivers/clocksource/mvebu.c
@@ -33,7 +33,7 @@
 
 static __iomem void *timer_base;
 
-static uint64_t mvebu_clocksource_read(void)
+static uint64_t mvebu_clocksource_read(void *ctx)
 {
 	return 0 - __raw_readl(timer_base + TIMER0_VAL_OFF);
 }
@@ -81,7 +81,7 @@ static int mvebu_timer_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(rate, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static struct of_device_id mvebu_timer_dt_ids[] = {
diff --git a/drivers/clocksource/nomadik.c b/drivers/clocksource/nomadik.c
index 7cf10352ea..99f58ef9f9 100644
--- a/drivers/clocksource/nomadik.c
+++ b/drivers/clocksource/nomadik.c
@@ -62,7 +62,7 @@ static u32 nmdk_cycle;		/* write-once */
  * clocksource: the MTU device is a decrementing counters, so we negate
  * the value being read.
  */
-static uint64_t nmdk_read_timer(void)
+static uint64_t nmdk_read_timer(void *ctx)
 {
 	return nmdk_cycle - readl(mtu_base + MTU_VAL(0));
 }
@@ -132,7 +132,7 @@ static int nmdk_mtu_probe(struct device_d *dev)
 
 	nmdk_clksrc.mult = clocksource_hz2mult(rate, nmdk_clksrc.shift);
 
-	return init_clock(&nmdk_clksrc);
+	return init_clock(&nmdk_clksrc, NULL);
 }
 
 static struct driver_d nmdk_mtu_driver = {
diff --git a/drivers/clocksource/orion.c b/drivers/clocksource/orion.c
index 4a56849800..dd9fac312f 100644
--- a/drivers/clocksource/orion.c
+++ b/drivers/clocksource/orion.c
@@ -22,7 +22,7 @@
 
 static __iomem void *timer_base;
 
-static uint64_t orion_clocksource_read(void)
+static uint64_t orion_clocksource_read(void *ctx)
 {
 	return 0 - __raw_readl(timer_base + TIMER0_VAL);
 }
@@ -56,7 +56,7 @@ static int orion_timer_probe(struct device_d *dev)
 
 	clksrc.mult = clocksource_hz2mult(clk_get_rate(tclk), clksrc.shift);
 
-	return init_clock(&clksrc);
+	return init_clock(&clksrc, NULL);
 }
 
 static struct of_device_id orion_timer_dt_ids[] = {
diff --git a/drivers/clocksource/rk_timer.c b/drivers/clocksource/rk_timer.c
index e941030771..54805da104 100644
--- a/drivers/clocksource/rk_timer.c
+++ b/drivers/clocksource/rk_timer.c
@@ -18,7 +18,7 @@
 
 struct rk_timer *timer_ptr;
 
-static uint64_t rockchip_get_ticks(void)
+static uint64_t rockchip_get_ticks(void *ctx)
 {
 	uint64_t timebase_h, timebase_l;
 
@@ -50,7 +50,7 @@ static int rockchip_timer_probe(struct device_d *dev)
 	writel(0xffffffff, &timer_ptr->timer_load_count1);
 	writel(1, &timer_ptr->timer_ctrl_reg);
 
-	return init_clock(&rkcs);
+	return init_clock(&rkcs, NULL);
 }
 
 static __maybe_unused struct of_device_id rktimer_dt_ids[] = {
diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c
index a133e384d7..0b8f526fb2 100644
--- a/drivers/clocksource/timer-atmel-pit.c
+++ b/drivers/clocksource/timer-atmel-pit.c
@@ -27,7 +27,7 @@
 
 static __iomem void *pit_base;
 
-static uint64_t at91sam9_clocksource_read(void)
+static uint64_t at91sam9_clocksource_read(void *ctx)
 {
 	return pit_read(AT91_PIT_PIIR);
 }
@@ -86,7 +86,7 @@ static int at91_pit_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(pit_rate, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 const static __maybe_unused struct of_device_id at91_pit_dt_ids[] = {
diff --git a/drivers/clocksource/timer-clint.c b/drivers/clocksource/timer-clint.c
index d48b5bcba0..c9ffd42508 100644
--- a/drivers/clocksource/timer-clint.c
+++ b/drivers/clocksource/timer-clint.c
@@ -49,7 +49,7 @@ static u64 notrace clint_get_cycles64(void)
 }
 #endif /* CONFIG_64BIT */
 
-static u64 clint_rdtime(void)
+static u64 clint_rdtime(void *ctx)
 {
 	return clint_get_cycles64();
 }
@@ -77,7 +77,7 @@ static int clint_timer_init_dt(struct device_d* dev)
 
 	clint_clocksource.mult = clocksource_hz2mult(riscv_timebase, clint_clocksource.shift);
 
-	return init_clock(&clint_clocksource);
+	return init_clock(&clint_clocksource, NULL);
 }
 
 static struct of_device_id timer_clint_dt_ids[] = {
diff --git a/drivers/clocksource/timer-imx-gpt.c b/drivers/clocksource/timer-imx-gpt.c
index 7ca879f4f0..e829ab25d2 100644
--- a/drivers/clocksource/timer-imx-gpt.c
+++ b/drivers/clocksource/timer-imx-gpt.c
@@ -55,7 +55,7 @@ static struct imx_gpt_regs regs_imx31 = {
 static struct imx_gpt_regs *regs;
 static void __iomem *timer_base;
 
-static uint64_t imx_clocksource_read(void)
+static uint64_t imx_clocksource_read(void *ctx)
 {
 	return readl(timer_base + regs->tcn);
 }
@@ -120,7 +120,7 @@ static int imx_gpt_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(rate, cs.shift);
 
-	init_clock(&cs);
+	init_clock(&cs, NULL);
 
 	clock_register_client(&imx_clock_notifier);
 
diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c
index c7af54fc8f..4ed28b4925 100644
--- a/drivers/clocksource/timer-riscv.c
+++ b/drivers/clocksource/timer-riscv.c
@@ -13,7 +13,7 @@
 #include <asm/timer.h>
 #include <asm/csr.h>
 
-static u64 notrace riscv_timer_get_count_time(void)
+static u64 notrace riscv_timer_get_count_time(void *ctx)
 {
 	__maybe_unused u32 hi, lo;
 
@@ -28,7 +28,7 @@ static u64 notrace riscv_timer_get_count_time(void)
 	return ((u64)hi << 32) | lo;
 }
 
-static u64 notrace riscv_timer_get_count_cycle(void)
+static u64 notrace riscv_timer_get_count_cycle(void *ctx)
 {
 	__maybe_unused u32 hi, lo;
 
@@ -64,7 +64,7 @@ static int riscv_timer_init(struct device_d* dev)
 
 	riscv_clocksource.mult = clocksource_hz2mult(riscv_timebase, riscv_clocksource.shift);
 
-	return init_clock(&riscv_clocksource);
+	return init_clock(&riscv_clocksource, NULL);
 }
 
 static struct driver_d riscv_timer_driver = {
diff --git a/drivers/clocksource/timer-stm32.c b/drivers/clocksource/timer-stm32.c
index dec48fccf5..b824d55c74 100644
--- a/drivers/clocksource/timer-stm32.c
+++ b/drivers/clocksource/timer-stm32.c
@@ -48,7 +48,7 @@ struct stm32_timer_regs {
 
 static struct stm32_timer_regs *timer_base;
 
-static u64 stm32_timer_read(void)
+static u64 stm32_timer_read(void *ctx)
 {
 	return readl(&timer_base->cnt);
 }
@@ -106,7 +106,7 @@ static int stm32_timer_probe(struct device_d *dev)
 
 	cs.mult = clocksource_hz2mult(MHZ_1, cs.shift);
 
-	return init_clock(&cs);
+	return init_clock(&cs, NULL);
 }
 
 static struct of_device_id stm32_timer_dt_ids[] = {
diff --git a/drivers/clocksource/timer-ti-32k.c b/drivers/clocksource/timer-ti-32k.c
index 21cb686369..2dc2c4aae9 100644
--- a/drivers/clocksource/timer-ti-32k.c
+++ b/drivers/clocksource/timer-ti-32k.c
@@ -37,7 +37,7 @@ static void __iomem *timerbase;
  *
  * @return S32K clock counter
  */
-static uint64_t s32k_clocksource_read(void)
+static uint64_t s32k_clocksource_read(void *ctx)
 {
 	return readl(timerbase + S32K_CR);
 }
@@ -74,7 +74,7 @@ static int omap_32ktimer_probe(struct device_d *dev)
 
 	s32k_cs.mult = clocksource_hz2mult(S32K_FREQUENCY, s32k_cs.shift);
 
-	return init_clock(&s32k_cs);
+	return init_clock(&s32k_cs, NULL);
 }
 
 static __maybe_unused struct of_device_id omap_32ktimer_dt_ids[] = {
diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c
index cdd297f10c..943e4cb772 100644
--- a/drivers/clocksource/timer-ti-dm.c
+++ b/drivers/clocksource/timer-ti-dm.c
@@ -53,7 +53,7 @@ static void *base;
  *
  * @return DMTimer counter
  */
-static uint64_t dmtimer_read(void)
+static uint64_t dmtimer_read(void *ctx)
 {
 	return readl(base + TCRR);
 }
@@ -86,7 +86,7 @@ static int omap_dmtimer_probe(struct device_d *dev)
 	/* Enable counter */
 	writel(0x3, base + TCLR);
 
-	return init_clock(&dmtimer_cs);
+	return init_clock(&dmtimer_cs, NULL);
 }
 
 static __maybe_unused struct of_device_id omap_dmtimer_dt_ids[] = {
diff --git a/drivers/clocksource/uemd.c b/drivers/clocksource/uemd.c
index a763eadc0c..fc10032009 100644
--- a/drivers/clocksource/uemd.c
+++ b/drivers/clocksource/uemd.c
@@ -43,7 +43,7 @@
 
 static void __iomem *timer_base;
 
-static uint64_t uemd_timer_cs_read(void)
+static uint64_t uemd_timer_cs_read(void *ctx)
 {
 	/* Down counter! */
 	return ~__raw_readl(timer_base + TIMER_VALUE);
@@ -98,7 +98,7 @@ static int uemd_timer_probe(struct device_d *dev)
 	clocks_calc_mult_shift(&uemd_cs.mult, &uemd_cs.shift,
 		clk_get_rate(timer_clk), NSEC_PER_SEC, 10);
 
-	return init_clock(&uemd_cs);
+	return init_clock(&uemd_cs, NULL);
 }
 
 static __maybe_unused struct of_device_id uemd_timer_dt_ids[] = {
diff --git a/include/clock.h b/include/clock.h
index e6197e7eb0..b7247d810c 100644
--- a/include/clock.h
+++ b/include/clock.h
@@ -10,11 +10,12 @@
 struct clocksource {
 	uint32_t	shift;
 	uint32_t	mult;
-	uint64_t	(*read)(void);
+	uint64_t	(*read)(void *);
 	uint64_t	cycle_last;
 	uint64_t	mask;
 	int		priority;
-	int		(*init)(struct clocksource*);
+	void		*ctx;
+	int		(*init)(struct clocksource *);
 };
 
 static inline uint64_t cyc2ns(struct clocksource *cs, uint64_t cycles)
@@ -24,7 +25,7 @@ static inline uint64_t cyc2ns(struct clocksource *cs, uint64_t cycles)
         return ret;
 }
 
-int init_clock(struct clocksource *);
+int init_clock(struct clocksource *, void *ctx);
 
 uint64_t get_time_ns(void);
 
-- 
2.32.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


             reply	other threads:[~2022-06-10  8:58 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-10  8:56 Alexander Shiyan [this message]
2022-06-10  8:56 ` [RFC 2/2] clocksource: arm_global_timer: Convert driver to use clocksource context field Alexander Shiyan
2022-06-10  9:40   ` Sascha Hauer
2022-06-10  9:53     ` Alexander Shiyan
2022-06-10  8:56 ` [RFC 0/2] Context storage for the clocksource Alexander Shiyan
2022-06-10  9:35 ` [RFC 1/2] clocksource: Introduce a context storage for the clocksource structure Sascha Hauer
2022-06-10  9:42   ` Alexander Shiyan
2022-06-10  9:44     ` Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220610085633.21606-1-eagle.alexander923@gmail.com \
    --to=eagle.alexander923@gmail.com \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.