From: tip-bot for Baolin Wang <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: pombredanne@nexb.com, mingo@kernel.org,
baolin.wang@spreadtrum.com, peterz@infradead.org,
tglx@linutronix.de, daniel.lezcano@linaro.org,
torvalds@linux-foundation.org, linux-kernel@vger.kernel.org,
hpa@zytor.com
Subject: [tip:timers/core] clocksource/drivers/spreadtrum: Add timer driver for the Spreadtrum SC9860 platform
Date: Mon, 8 Jan 2018 09:29:12 -0800 [thread overview]
Message-ID: <tip-067bc9144766495650e621b79bd2bc199cee0769@git.kernel.org> (raw)
In-Reply-To: <1515418139-23276-8-git-send-email-daniel.lezcano@linaro.org>
Commit-ID: 067bc9144766495650e621b79bd2bc199cee0769
Gitweb: https://git.kernel.org/tip/067bc9144766495650e621b79bd2bc199cee0769
Author: Baolin Wang <baolin.wang@spreadtrum.com>
AuthorDate: Mon, 8 Jan 2018 14:28:47 +0100
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Mon, 8 Jan 2018 17:57:24 +0100
clocksource/drivers/spreadtrum: Add timer driver for the Spreadtrum SC9860 platform
The Spreadtrum SC9860 platform will use the architected timers as local
clock events, but we also need a broadcast timer device to wake up the
CPUs when the CPUs are in sleep mode.
The Spreadtrum timer can support 32-bit or 64-bit counters, as well as
supporting period mode or one-shot mode.
Signed-off-by: Baolin Wang <baolin.wang@spreadtrum.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: Philippe Ombredanne <pombredanne@nexb.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1515418139-23276-8-git-send-email-daniel.lezcano@linaro.org
[ Minor readability edits. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
drivers/clocksource/Kconfig | 7 ++
drivers/clocksource/Makefile | 1 +
drivers/clocksource/timer-sprd.c | 159 +++++++++++++++++++++++++++++++++++++++
3 files changed, 167 insertions(+)
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index c729a88..0359812 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -441,6 +441,13 @@ config MTK_TIMER
help
Support for Mediatek timer driver.
+config SPRD_TIMER
+ bool "Spreadtrum timer driver" if COMPILE_TEST
+ depends on HAS_IOMEM
+ select TIMER_OF
+ help
+ Enables support for the Spreadtrum timer driver.
+
config SYS_SUPPORTS_SH_MTU2
bool
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index 72711f1..d6dec44 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -54,6 +54,7 @@ obj-$(CONFIG_CLKSRC_TI_32K) += timer-ti-32k.o
obj-$(CONFIG_CLKSRC_NPS) += timer-nps.o
obj-$(CONFIG_OXNAS_RPS_TIMER) += timer-oxnas-rps.o
obj-$(CONFIG_OWL_TIMER) += owl-timer.o
+obj-$(CONFIG_SPRD_TIMER) += timer-sprd.o
obj-$(CONFIG_ARC_TIMERS) += arc_timer.o
obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o
diff --git a/drivers/clocksource/timer-sprd.c b/drivers/clocksource/timer-sprd.c
new file mode 100644
index 0000000..ef9ebea
--- /dev/null
+++ b/drivers/clocksource/timer-sprd.c
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2017 Spreadtrum Communications Inc.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+
+#include "timer-of.h"
+
+#define TIMER_NAME "sprd_timer"
+
+#define TIMER_LOAD_LO 0x0
+#define TIMER_LOAD_HI 0x4
+#define TIMER_VALUE_LO 0x8
+#define TIMER_VALUE_HI 0xc
+
+#define TIMER_CTL 0x10
+#define TIMER_CTL_PERIOD_MODE BIT(0)
+#define TIMER_CTL_ENABLE BIT(1)
+#define TIMER_CTL_64BIT_WIDTH BIT(16)
+
+#define TIMER_INT 0x14
+#define TIMER_INT_EN BIT(0)
+#define TIMER_INT_RAW_STS BIT(1)
+#define TIMER_INT_MASK_STS BIT(2)
+#define TIMER_INT_CLR BIT(3)
+
+#define TIMER_VALUE_SHDW_LO 0x18
+#define TIMER_VALUE_SHDW_HI 0x1c
+
+#define TIMER_VALUE_LO_MASK GENMASK(31, 0)
+
+static void sprd_timer_enable(void __iomem *base, u32 flag)
+{
+ u32 val = readl_relaxed(base + TIMER_CTL);
+
+ val |= TIMER_CTL_ENABLE;
+ if (flag & TIMER_CTL_64BIT_WIDTH)
+ val |= TIMER_CTL_64BIT_WIDTH;
+ else
+ val &= ~TIMER_CTL_64BIT_WIDTH;
+
+ if (flag & TIMER_CTL_PERIOD_MODE)
+ val |= TIMER_CTL_PERIOD_MODE;
+ else
+ val &= ~TIMER_CTL_PERIOD_MODE;
+
+ writel_relaxed(val, base + TIMER_CTL);
+}
+
+static void sprd_timer_disable(void __iomem *base)
+{
+ u32 val = readl_relaxed(base + TIMER_CTL);
+
+ val &= ~TIMER_CTL_ENABLE;
+ writel_relaxed(val, base + TIMER_CTL);
+}
+
+static void sprd_timer_update_counter(void __iomem *base, unsigned long cycles)
+{
+ writel_relaxed(cycles & TIMER_VALUE_LO_MASK, base + TIMER_LOAD_LO);
+ writel_relaxed(0, base + TIMER_LOAD_HI);
+}
+
+static void sprd_timer_enable_interrupt(void __iomem *base)
+{
+ writel_relaxed(TIMER_INT_EN, base + TIMER_INT);
+}
+
+static void sprd_timer_clear_interrupt(void __iomem *base)
+{
+ u32 val = readl_relaxed(base + TIMER_INT);
+
+ val |= TIMER_INT_CLR;
+ writel_relaxed(val, base + TIMER_INT);
+}
+
+static int sprd_timer_set_next_event(unsigned long cycles,
+ struct clock_event_device *ce)
+{
+ struct timer_of *to = to_timer_of(ce);
+
+ sprd_timer_disable(timer_of_base(to));
+ sprd_timer_update_counter(timer_of_base(to), cycles);
+ sprd_timer_enable(timer_of_base(to), 0);
+
+ return 0;
+}
+
+static int sprd_timer_set_periodic(struct clock_event_device *ce)
+{
+ struct timer_of *to = to_timer_of(ce);
+
+ sprd_timer_disable(timer_of_base(to));
+ sprd_timer_update_counter(timer_of_base(to), timer_of_period(to));
+ sprd_timer_enable(timer_of_base(to), TIMER_CTL_PERIOD_MODE);
+
+ return 0;
+}
+
+static int sprd_timer_shutdown(struct clock_event_device *ce)
+{
+ struct timer_of *to = to_timer_of(ce);
+
+ sprd_timer_disable(timer_of_base(to));
+ return 0;
+}
+
+static irqreturn_t sprd_timer_interrupt(int irq, void *dev_id)
+{
+ struct clock_event_device *ce = (struct clock_event_device *)dev_id;
+ struct timer_of *to = to_timer_of(ce);
+
+ sprd_timer_clear_interrupt(timer_of_base(to));
+
+ if (clockevent_state_oneshot(ce))
+ sprd_timer_disable(timer_of_base(to));
+
+ ce->event_handler(ce);
+ return IRQ_HANDLED;
+}
+
+static struct timer_of to = {
+ .flags = TIMER_OF_IRQ | TIMER_OF_BASE | TIMER_OF_CLOCK,
+
+ .clkevt = {
+ .name = TIMER_NAME,
+ .rating = 300,
+ .features = CLOCK_EVT_FEAT_DYNIRQ | CLOCK_EVT_FEAT_PERIODIC |
+ CLOCK_EVT_FEAT_ONESHOT,
+ .set_state_shutdown = sprd_timer_shutdown,
+ .set_state_periodic = sprd_timer_set_periodic,
+ .set_next_event = sprd_timer_set_next_event,
+ .cpumask = cpu_possible_mask,
+ },
+
+ .of_irq = {
+ .handler = sprd_timer_interrupt,
+ .flags = IRQF_TIMER | IRQF_IRQPOLL,
+ },
+};
+
+static int __init sprd_timer_init(struct device_node *np)
+{
+ int ret;
+
+ ret = timer_of_init(np, &to);
+ if (ret)
+ return ret;
+
+ sprd_timer_enable_interrupt(timer_of_base(&to));
+ clockevents_config_and_register(&to.clkevt, timer_of_rate(&to),
+ 1, UINT_MAX);
+
+ return 0;
+}
+
+TIMER_OF_DECLARE(sc9860_timer, "sprd,sc9860-timer", sprd_timer_init);
next prev parent reply other threads:[~2018-01-08 17:33 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-08 13:27 [PULL] clockevents for 4.16 Daniel Lezcano
2018-01-08 13:28 ` [PATCH 01/20] dt-bindings: timer: Add Actions Semi S700 Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 13:28 ` [PATCH 02/20] clocksource/drivers/owl: Adopt TIMER_OF_DECLARE() Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 13:28 ` [PATCH 03/20] clocksource/drivers/owl: Add the S700 Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 13:28 ` [PATCH 04/20] clocksource/drivers/tcb_clksrc: Fix clock speed message Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:27 ` [tip:timers/core] " tip-bot for Romain Izard
2018-01-08 13:28 ` [PATCH 05/20] clocksource/drivers/timer-of: Fix function names Daniel Lezcano
2018-01-08 17:27 ` [tip:timers/core] " tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 06/20] clocksource/drivers/timer-of: Add kernel documentation Daniel Lezcano
2018-01-08 17:28 ` [tip:timers/core] " tip-bot for Daniel Lezcano
[not found] ` <1515418139-23276-1-git-send-email-daniel.lezcano-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2018-01-08 13:28 ` [PATCH 07/20] dt-bindings: clocksource: Add Spreadtrum SC9860 timer Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:28 ` [tip:timers/core] dt-bindings/clocksource: Add Spreadtrum SC9860 timer documentation tip-bot for Baolin Wang
2018-01-08 13:28 ` [PATCH 08/20] clocksource/drivers/spreadtrum: Add timer driver for Spreadtrum SC9860 platform Daniel Lezcano
2018-01-08 17:29 ` tip-bot for Baolin Wang [this message]
2018-01-08 13:28 ` [PATCH 09/20] clocksource/drivers/timer-of: Store the device node pointer Daniel Lezcano
2018-01-08 17:29 ` [tip:timers/core] clocksource/drivers/timer-of: Store the device node pointer in 'struct timer_of' tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 10/20] clocksource/drivers/timer-of: Don't request the resource by name Daniel Lezcano
2018-01-08 17:30 ` [tip:timers/core] " tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 11/20] clocksource/drivers/stm32: Fix kernel panic with multiple timers Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:30 ` [tip:timers/core] " tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 12/20] clocksource/drivers/stm32: Convert the driver to timer-of Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:30 ` [tip:timers/core] clocksource/drivers/stm32: Convert the driver to timer_of primitives tip-bot for Benjamin Gaignard
2018-01-08 13:28 ` [PATCH 13/20] clocksource/drivers/stm32: Use the node name as timer name Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:31 ` [tip:timers/core] " tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 14/20] clocksource/drivers/stm32: Encapsulate the timer width sorting out function Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:31 ` [tip:timers/core] clocksource/drivers/stm32: Factor out the timer width sorting code tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 15/20] clocksource/drivers/stm32: Compute a prescaler value with a targeted rate Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:32 ` [tip:timers/core] " tip-bot for Benjamin Gaignard
2018-01-08 13:28 ` [PATCH 16/20] clocksource/drivers/stm32: Add the oneshot mode Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:32 ` [tip:timers/core] clocksource/drivers/stm32: Add " tip-bot for Benjamin Gaignard
2018-01-08 13:28 ` [PATCH 17/20] clocksource/drivers/stm32: Encapsulate more the clockevent code Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:33 ` [tip:timers/core] clocksource/drivers/stm32: Factor out more of " tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 18/20] clocksource/drivers/stm32: Add the clocksource Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:33 ` [tip:timers/core] clocksource/drivers/stm32: Add clocksource functionality tip-bot for Benjamin Gaignard
2018-01-08 13:28 ` [PATCH 19/20] clocksource/drivers/stm32: Add the timer delay Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:33 ` [tip:timers/core] clocksource/drivers/stm32: Add the timer delay callback tip-bot for Daniel Lezcano
2018-01-08 13:28 ` [PATCH 20/20] clocksource/drivers/stm32: Start the timer's counter sooner Daniel Lezcano
2018-01-08 13:28 ` Daniel Lezcano
2018-01-08 17:34 ` [tip:timers/core] " tip-bot for Daniel Lezcano
2018-01-08 16:58 ` [PULL] clockevents for 4.16 Ingo Molnar
2018-01-08 17:07 ` 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=tip-067bc9144766495650e621b79bd2bc199cee0769@git.kernel.org \
--to=tipbot@zytor.com \
--cc=baolin.wang@spreadtrum.com \
--cc=daniel.lezcano@linaro.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=pombredanne@nexb.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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.