From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: tglx@linutronix.de
Cc: linux-kernel@vger.kernel.org,
Linus Walleij <linus.walleij@linaro.org>,
Andrew Jeffery <andrew@aj.id.au>, Joel Stanley <joel@jms.id.au>,
Jonas Jensen <jonas.jensen@gmail.com>
Subject: [PATCH 22/23] clocksource/drivers/fttmr010: Implement delay timer
Date: Wed, 14 Jun 2017 14:39:43 +0200 [thread overview]
Message-ID: <1497443984-12371-22-git-send-email-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <1497443984-12371-1-git-send-email-daniel.lezcano@linaro.org>
From: Linus Walleij <linus.walleij@linaro.org>
This timer is often used on the ARM architecture, so as with so
many siblings, we can implement delay timers, removing the need
for the system to calibrate jiffys at boot, and potentially
handling CPU frequency scaling on targets.
We cannot just protect the Kconfig with a "depends on ARM" because
it is already known that different architectures are using Faraday
IP blocks, so it is better to make things open-ended and use
Result on boot dmesg:
Switching to timer-based delay loop, resolution 40n
Calibrating delay loop (skipped), value calculated using
timer frequency.. 50.00 BogoMIPS (lpj=250000)
This is accurately the timer frequency, 250MHz on the APB
bus.
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Jonas Jensen <jonas.jensen@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Jonas Jensen <jonas.jensen@gmail.com>
Tested-by: Andrew Jeffery <andrew@aj.id.au>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/clocksource/timer-fttmr010.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/drivers/clocksource/timer-fttmr010.c b/drivers/clocksource/timer-fttmr010.c
index b56d7bd..0093704 100644
--- a/drivers/clocksource/timer-fttmr010.c
+++ b/drivers/clocksource/timer-fttmr010.c
@@ -17,6 +17,7 @@
#include <linux/clk.h>
#include <linux/slab.h>
#include <linux/bitops.h>
+#include <linux/delay.h>
/*
* Register definitions for the timers
@@ -81,9 +82,15 @@ struct fttmr010 {
bool count_down;
u32 t1_enable_val;
struct clock_event_device clkevt;
+#ifdef CONFIG_ARM
+ struct delay_timer delay_timer;
+#endif
};
-/* A local singleton used by sched_clock, which is stateless */
+/*
+ * A local singleton used by sched_clock and delay timer reads, which are
+ * fast and stateless
+ */
static struct fttmr010 *local_fttmr;
static inline struct fttmr010 *to_fttmr010(struct clock_event_device *evt)
@@ -101,6 +108,20 @@ static u64 notrace fttmr010_read_sched_clock_down(void)
return ~readl(local_fttmr->base + TIMER2_COUNT);
}
+#ifdef CONFIG_ARM
+
+static unsigned long fttmr010_read_current_timer_up(void)
+{
+ return readl(local_fttmr->base + TIMER2_COUNT);
+}
+
+static unsigned long fttmr010_read_current_timer_down(void)
+{
+ return ~readl(local_fttmr->base + TIMER2_COUNT);
+}
+
+#endif
+
static int fttmr010_timer_set_next_event(unsigned long cycles,
struct clock_event_device *evt)
{
@@ -347,6 +368,18 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
fttmr010->tick_rate,
1, 0xffffffff);
+#ifdef CONFIG_ARM
+ /* Also use this timer for delays */
+ if (fttmr010->count_down)
+ fttmr010->delay_timer.read_current_timer =
+ fttmr010_read_current_timer_down;
+ else
+ fttmr010->delay_timer.read_current_timer =
+ fttmr010_read_current_timer_up;
+ fttmr010->delay_timer.freq = fttmr010->tick_rate;
+ register_current_timer_delay(&fttmr010->delay_timer);
+#endif
+
return 0;
out_unmap:
--
2.7.4
next prev parent reply other threads:[~2017-06-14 12:43 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-14 12:38 [GIT PULL] clockevents for 4.13 Daniel Lezcano
2017-06-14 12:39 ` [PATCH 01/23] arm: aspeed: Add clock-names property to timer node Daniel Lezcano
2017-06-14 12:39 ` [PATCH 02/23] clocksource/drivers/fttmr010: Fix the clock handling Daniel Lezcano
2017-06-14 12:39 ` [PATCH 03/23] clocksource/drivers/fttmr010: Merge FTTMR010 DT bindings Daniel Lezcano
2017-06-14 12:39 ` [PATCH 04/23] clocksource/drivers/fttmr010: Drop Gemini specifics Daniel Lezcano
2017-06-14 12:39 ` [PATCH 05/23] clocksource/drivers/fttmr010: Use state container Daniel Lezcano
2017-06-14 12:39 ` [PATCH 06/23] clocksource/drivers/fttmr010: Switch to use bitops Daniel Lezcano
2017-06-14 12:39 ` [PATCH 07/23] clocksource/drivers/fttmr010: Switch to use TIMER2 src Daniel Lezcano
2017-06-14 12:39 ` [PATCH 08/23] clocksource/drivers/fttmr010: Merge Moxa into FTTMR010 Daniel Lezcano
2017-06-14 12:39 ` [PATCH 09/23] clocksource/drivers/fttmr010: Add AST2500 compatible string Daniel Lezcano
2017-06-14 12:39 ` [PATCH 10/23] clocksource/drivers/fttmr010: Fix aspeed-2500 initialization Daniel Lezcano
2017-06-14 12:39 ` [PATCH 11/23] Revert "clockevents: Add a clkevt-of mechanism like clksrc-of" Daniel Lezcano
2017-06-14 12:39 ` [PATCH 14/23] clocksource/drivers: Rename CLOCKSOURCE_ACPI_DECLARE to TIMER_ACPI_DECLARE Daniel Lezcano
2017-06-14 12:39 ` [PATCH 15/23] clocksource/drivers: Rename clksrc table to timer Daniel Lezcano
2017-06-14 12:39 ` [PATCH 16/23] clocksource/drivers: Rename CLKSRC_OF to TIMER_OF Daniel Lezcano
2017-06-14 12:39 ` [PATCH 17/23] clocksource/drivers: Rename CLKSRC_ACPI to TIMER_ACPI Daniel Lezcano
2017-06-14 12:39 ` [PATCH 18/23] clocksource/drivers: Add an alias macro CLOCKSOURCE_OF_DECLARE Daniel Lezcano
2017-06-14 12:39 ` [PATCH 19/23] clocksource/drivers/fttmr010: Optimize sched_clock() Daniel Lezcano
2017-06-14 12:39 ` [PATCH 20/23] clocksource/drivers/tcb_clksrc: Save timer context on suspend/resume Daniel Lezcano
2017-06-14 12:39 ` [PATCH 21/23] clocksource/drivers: Add timer-of common init routine Daniel Lezcano
2017-06-14 12:39 ` Daniel Lezcano [this message]
2017-06-14 12:39 ` [PATCH 23/23] clocksource/drivers/fttmr010: Factor out clock read code Daniel Lezcano
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=1497443984-12371-22-git-send-email-daniel.lezcano@linaro.org \
--to=daniel.lezcano@linaro.org \
--cc=andrew@aj.id.au \
--cc=joel@jms.id.au \
--cc=jonas.jensen@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®