All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] ARM: meson: add clocksource support
@ 2014-09-15 13:11 Carlo Caione
  2014-09-15 13:11 ` [PATCH 1/2] ARM: meson: documentation: add timer documentation Carlo Caione
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Carlo Caione @ 2014-09-15 13:11 UTC (permalink / raw)
  To: linux-arm-kernel

Two patches taken from patchset http://www.spinics.net/lists/devicetree/msg48979.html
adding support for clocksource and clockevents driver.

Daniel and Thomas,
if it's fine with you, could you please take these patches in the clocksource
tree?

Thanks,

Carlo Caione (2):
  ARM: meson: documentation: add timer documentation
  ARM: meson6: clocksource: add Meson6 timer support

 .../bindings/timer/amlogic,meson6-timer.txt        |  16 ++
 drivers/clocksource/Kconfig                        |   3 +
 drivers/clocksource/Makefile                       |   1 +
 drivers/clocksource/meson6_timer.c                 | 167 +++++++++++++++++++++
 4 files changed, 187 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt
 create mode 100644 drivers/clocksource/meson6_timer.c

-- 
1.9.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] ARM: meson: documentation: add timer documentation
  2014-09-15 13:11 [PATCH 0/2] ARM: meson: add clocksource support Carlo Caione
@ 2014-09-15 13:11 ` Carlo Caione
  2014-09-15 13:11 ` [PATCH 2/2] ARM: meson6: clocksource: add Meson6 timer support Carlo Caione
  2014-09-15 21:02 ` [PATCH 0/2] ARM: meson: add clocksource support Daniel Lezcano
  2 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2014-09-15 13:11 UTC (permalink / raw)
  To: linux-arm-kernel

Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Carlo Caione <carlo@caione.org>
---
 .../devicetree/bindings/timer/amlogic,meson6-timer.txt   | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt

diff --git a/Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt b/Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt
new file mode 100644
index 0000000..d79be27
--- /dev/null
+++ b/Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt
@@ -0,0 +1,16 @@
+Amlogic Meson6 SoCs Timer Controller
+
+Required properties:
+
+- compatible : should be "amlogic,meson6-timer"
+- reg : Specifies base physical address and size of the registers.
+- interrupts : The interrupt of the first timer
+
+Example:
+
+timer at c1109940 {
+	compatible = "amlogic,meson6-timer";
+	reg = <0xc1109940 0x14>;
+	interrupts = <0 10 1>;
+};
+
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] ARM: meson6: clocksource: add Meson6 timer support
  2014-09-15 13:11 [PATCH 0/2] ARM: meson: add clocksource support Carlo Caione
  2014-09-15 13:11 ` [PATCH 1/2] ARM: meson: documentation: add timer documentation Carlo Caione
@ 2014-09-15 13:11 ` Carlo Caione
  2014-09-15 21:02 ` [PATCH 0/2] ARM: meson: add clocksource support Daniel Lezcano
  2 siblings, 0 replies; 6+ messages in thread
From: Carlo Caione @ 2014-09-15 13:11 UTC (permalink / raw)
  To: linux-arm-kernel

Meson6 SoCs are equipped with 5 32-bit timers, called TIMER_A, TIMER_B,
TIMER_C, TIMER_D and TIMER_E.

The driver is providing clocksource support for the 32-bit counter using
TIMER_E. Clockevents are also supported using TIMER_A.

Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Carlo Caione <carlo@caione.org>
---
 drivers/clocksource/Kconfig        |   3 +
 drivers/clocksource/Makefile       |   1 +
 drivers/clocksource/meson6_timer.c | 167 +++++++++++++++++++++++++++++++++++++
 3 files changed, 171 insertions(+)
 create mode 100644 drivers/clocksource/meson6_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index cfd6519..38029ca 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -30,6 +30,9 @@ config ARMADA_370_XP_TIMER
 	bool
 	select CLKSRC_OF
 
+config MESON6_TIMER
+	bool
+
 config ORION_TIMER
 	select CLKSRC_OF
 	select CLKSRC_MMIO
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index 7fd9fd1..e4ae987 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_ARCH_PRIMA2)	+= timer-prima2.o
 obj-$(CONFIG_ARCH_U300)		+= timer-u300.o
 obj-$(CONFIG_SUN4I_TIMER)	+= sun4i_timer.o
 obj-$(CONFIG_SUN5I_HSTIMER)	+= timer-sun5i.o
+obj-$(CONFIG_MESON6_TIMER)	+= meson6_timer.o
 obj-$(CONFIG_ARCH_TEGRA)	+= tegra20_timer.o
 obj-$(CONFIG_VT8500_TIMER)	+= vt8500_timer.o
 obj-$(CONFIG_ARCH_NSPIRE)	+= zevio-timer.o
diff --git a/drivers/clocksource/meson6_timer.c b/drivers/clocksource/meson6_timer.c
new file mode 100644
index 0000000..5c15cba
--- /dev/null
+++ b/drivers/clocksource/meson6_timer.c
@@ -0,0 +1,167 @@
+/*
+ * Amlogic Meson6 SoCs timer handling.
+ *
+ * Copyright (C) 2014 Carlo Caione <carlo@caione.org>
+ *
+ * Based on code from Amlogic, Inc
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/irqreturn.h>
+#include <linux/sched_clock.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+
+#define CED_ID			0
+#define CSD_ID			4
+
+#define TIMER_ISA_MUX		0
+#define TIMER_ISA_VAL(t)	(((t) + 1) << 2)
+
+#define TIMER_INPUT_BIT(t)	(2 * (t))
+#define TIMER_ENABLE_BIT(t)	(16 + (t))
+#define TIMER_PERIODIC_BIT(t)	(12 + (t))
+
+#define TIMER_CED_INPUT_MASK	(3UL << TIMER_INPUT_BIT(CED_ID))
+#define TIMER_CSD_INPUT_MASK	(7UL << TIMER_INPUT_BIT(CSD_ID))
+
+#define TIMER_CED_UNIT_1US	0
+#define TIMER_CSD_UNIT_1US	1
+
+static void __iomem *timer_base;
+
+static u64 notrace meson6_timer_sched_read(void)
+{
+	return (u64)readl(timer_base + TIMER_ISA_VAL(CSD_ID));
+}
+
+static void meson6_clkevt_time_stop(unsigned char timer)
+{
+	u32 val = readl(timer_base + TIMER_ISA_MUX);
+
+	writel(val & ~TIMER_ENABLE_BIT(timer), timer_base + TIMER_ISA_MUX);
+}
+
+static void meson6_clkevt_time_setup(unsigned char timer, unsigned long delay)
+{
+	writel(delay, timer_base + TIMER_ISA_VAL(timer));
+}
+
+static void meson6_clkevt_time_start(unsigned char timer, bool periodic)
+{
+	u32 val = readl(timer_base + TIMER_ISA_MUX);
+
+	if (periodic)
+		val |= TIMER_PERIODIC_BIT(timer);
+	else
+		val &= ~TIMER_PERIODIC_BIT(timer);
+
+	writel(val | TIMER_ENABLE_BIT(timer), timer_base + TIMER_ISA_MUX);
+}
+
+static void meson6_clkevt_mode(enum clock_event_mode mode,
+			       struct clock_event_device *clk)
+{
+	switch (mode) {
+	case CLOCK_EVT_MODE_PERIODIC:
+		meson6_clkevt_time_stop(CED_ID);
+		meson6_clkevt_time_setup(CED_ID, USEC_PER_SEC/HZ - 1);
+		meson6_clkevt_time_start(CED_ID, true);
+		break;
+	case CLOCK_EVT_MODE_ONESHOT:
+		meson6_clkevt_time_stop(CED_ID);
+		meson6_clkevt_time_start(CED_ID, false);
+		break;
+	case CLOCK_EVT_MODE_UNUSED:
+	case CLOCK_EVT_MODE_SHUTDOWN:
+	default:
+		meson6_clkevt_time_stop(CED_ID);
+		break;
+	}
+}
+
+static int meson6_clkevt_next_event(unsigned long evt,
+				    struct clock_event_device *unused)
+{
+	meson6_clkevt_time_stop(CED_ID);
+	meson6_clkevt_time_setup(CED_ID, evt);
+	meson6_clkevt_time_start(CED_ID, false);
+
+	return 0;
+}
+
+static struct clock_event_device meson6_clockevent = {
+	.name		= "meson6_tick",
+	.rating		= 400,
+	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+	.set_mode	= meson6_clkevt_mode,
+	.set_next_event	= meson6_clkevt_next_event,
+};
+
+static irqreturn_t meson6_timer_interrupt(int irq, void *dev_id)
+{
+	struct clock_event_device *evt = (struct clock_event_device *)dev_id;
+
+	evt->event_handler(evt);
+
+	return IRQ_HANDLED;
+}
+
+static struct irqaction meson6_timer_irq = {
+	.name		= "meson6_timer",
+	.flags		= IRQF_TIMER | IRQF_IRQPOLL,
+	.handler	= meson6_timer_interrupt,
+	.dev_id		= &meson6_clockevent,
+};
+
+static void __init meson6_timer_init(struct device_node *node)
+{
+	u32 val;
+	int ret, irq;
+
+	timer_base = of_io_request_and_map(node, 0, "meson6-timer");
+	if (IS_ERR(timer_base))
+		panic("Can't map registers");
+
+	irq = irq_of_parse_and_map(node, 0);
+	if (irq <= 0)
+		panic("Can't parse IRQ");
+
+	/* Set 1us for timer E */
+	val = readl(timer_base + TIMER_ISA_MUX);
+	val &= ~TIMER_CSD_INPUT_MASK;
+	val |= TIMER_CSD_UNIT_1US << TIMER_INPUT_BIT(CSD_ID);
+	writel(val, timer_base + TIMER_ISA_MUX);
+
+	sched_clock_register(meson6_timer_sched_read, 32, USEC_PER_SEC);
+	clocksource_mmio_init(timer_base + TIMER_ISA_VAL(CSD_ID), node->name,
+			      1000 * 1000, 300, 32, clocksource_mmio_readl_up);
+
+	/* Timer A base 1us */
+	val &= ~TIMER_CED_INPUT_MASK;
+	val |= TIMER_CED_UNIT_1US << TIMER_INPUT_BIT(CED_ID);
+	writel(val, timer_base + TIMER_ISA_MUX);
+
+	/* Stop the timer A */
+	meson6_clkevt_time_stop(CED_ID);
+
+	ret = setup_irq(irq, &meson6_timer_irq);
+	if (ret)
+		pr_warn("failed to setup irq %d\n", irq);
+
+	meson6_clockevent.cpumask = cpu_possible_mask;
+	meson6_clockevent.irq = irq;
+
+	clockevents_config_and_register(&meson6_clockevent, USEC_PER_SEC,
+					1, 0xfffe);
+}
+CLOCKSOURCE_OF_DECLARE(meson6, "amlogic,meson6-timer",
+		       meson6_timer_init);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 0/2] ARM: meson: add clocksource support
  2014-09-15 13:11 [PATCH 0/2] ARM: meson: add clocksource support Carlo Caione
  2014-09-15 13:11 ` [PATCH 1/2] ARM: meson: documentation: add timer documentation Carlo Caione
  2014-09-15 13:11 ` [PATCH 2/2] ARM: meson6: clocksource: add Meson6 timer support Carlo Caione
@ 2014-09-15 21:02 ` Daniel Lezcano
  2014-09-25 17:17   ` Carlo Caione
  2 siblings, 1 reply; 6+ messages in thread
From: Daniel Lezcano @ 2014-09-15 21:02 UTC (permalink / raw)
  To: linux-arm-kernel

On 09/15/2014 06:11 AM, Carlo Caione wrote:
> Two patches taken from patchset http://www.spinics.net/lists/devicetree/msg48979.html
> adding support for clocksource and clockevents driver.
>
> Daniel and Thomas,
> if it's fine with you, could you please take these patches in the clocksource
> tree?

Hi Carlo,

just a head up to tell you I saw your patchset. I am right now traveling 
so I will review the patches and pick them up as soon as I come back.

Thanks

   -- Daniel

> Carlo Caione (2):
>    ARM: meson: documentation: add timer documentation
>    ARM: meson6: clocksource: add Meson6 timer support
>
>   .../bindings/timer/amlogic,meson6-timer.txt        |  16 ++
>   drivers/clocksource/Kconfig                        |   3 +
>   drivers/clocksource/Makefile                       |   1 +
>   drivers/clocksource/meson6_timer.c                 | 167 +++++++++++++++++++++
>   4 files changed, 187 insertions(+)
>   create mode 100644 Documentation/devicetree/bindings/timer/amlogic,meson6-timer.txt
>   create mode 100644 drivers/clocksource/meson6_timer.c
>


-- 
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 0/2] ARM: meson: add clocksource support
  2014-09-15 21:02 ` [PATCH 0/2] ARM: meson: add clocksource support Daniel Lezcano
@ 2014-09-25 17:17   ` Carlo Caione
  2014-09-25 17:46     ` Daniel Lezcano
  0 siblings, 1 reply; 6+ messages in thread
From: Carlo Caione @ 2014-09-25 17:17 UTC (permalink / raw)
  To: linux-arm-kernel

On lun, set 15, 2014 at 02:02:56 -0700, Daniel Lezcano wrote:
> On 09/15/2014 06:11 AM, Carlo Caione wrote:
> >Two patches taken from patchset http://www.spinics.net/lists/devicetree/msg48979.html
> >adding support for clocksource and clockevents driver.
> >
> >Daniel and Thomas,
> >if it's fine with you, could you please take these patches in the clocksource
> >tree?
> 
> Hi Carlo,
> 
> just a head up to tell you I saw your patchset. I am right now
> traveling so I will review the patches and pick them up as soon as I
> come back.

Hi Daniel,
have you had any chance to look at this?

Thanks,

-- 
Carlo Caione

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 0/2] ARM: meson: add clocksource support
  2014-09-25 17:17   ` Carlo Caione
@ 2014-09-25 17:46     ` Daniel Lezcano
  0 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2014-09-25 17:46 UTC (permalink / raw)
  To: linux-arm-kernel

On 09/25/2014 07:17 PM, Carlo Caione wrote:
> On lun, set 15, 2014 at 02:02:56 -0700, Daniel Lezcano wrote:
>> On 09/15/2014 06:11 AM, Carlo Caione wrote:
>>> Two patches taken from patchset http://www.spinics.net/lists/devicetree/msg48979.html
>>> adding support for clocksource and clockevents driver.
>>>
>>> Daniel and Thomas,
>>> if it's fine with you, could you please take these patches in the clocksource
>>> tree?
>>
>> Hi Carlo,
>>
>> just a head up to tell you I saw your patchset. I am right now
>> traveling so I will review the patches and pick them up as soon as I
>> come back.
>
> Hi Daniel,
> have you had any chance to look at this?

I am on it.

   -- Daniel


-- 
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-09-25 17:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-15 13:11 [PATCH 0/2] ARM: meson: add clocksource support Carlo Caione
2014-09-15 13:11 ` [PATCH 1/2] ARM: meson: documentation: add timer documentation Carlo Caione
2014-09-15 13:11 ` [PATCH 2/2] ARM: meson6: clocksource: add Meson6 timer support Carlo Caione
2014-09-15 21:02 ` [PATCH 0/2] ARM: meson: add clocksource support Daniel Lezcano
2014-09-25 17:17   ` Carlo Caione
2014-09-25 17:46     ` Daniel Lezcano

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.