linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: daniel.lezcano@linaro.org (Daniel Lezcano)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 71/71] clocksource: Add Freescale FlexTimer Module (FTM) timer support
Date: Fri, 23 May 2014 12:31:51 +0200	[thread overview]
Message-ID: <1400841111-6683-71-git-send-email-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <1400841111-6683-1-git-send-email-daniel.lezcano@linaro.org>

From: Xiubo Li <Li.Xiubo@freescale.com>

The Freescale FlexTimer Module time reference is a 16-bit counter
that can be used as an unsigned or signed increase counter.

CNTIN defines the starting value of the count and MOD defines the
final value of the count. The value of CNTIN is loaded into the FTM
counter, and the counter increments until the value of MOD is reached,
at which point the counter is reloaded with the value of CNTIN. That's
also when an overflow interrupt will be generated.

Here using the 'evt' prefix or postfix as clock event device and
the 'src' as clock source device.

Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com>
Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Jingchang Lu <b35083@freescale.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/clocksource/Kconfig         |    5 +
 drivers/clocksource/Makefile        |    1 +
 drivers/clocksource/fsl_ftm_timer.c |  367 +++++++++++++++++++++++++++++++++++
 3 files changed, 373 insertions(+)
 create mode 100644 drivers/clocksource/fsl_ftm_timer.c

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 96918e1..0437767 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -136,6 +136,11 @@ config CLKSRC_SAMSUNG_PWM
 	  for all devicetree enabled platforms. This driver will be
 	  needed only on systems that do not have the Exynos MCT available.
 
+config FSL_FTM_TIMER
+	bool
+	help
+	  Support for Freescale FlexTimer Module (FTM) timer.
+
 config VF_PIT_TIMER
 	bool
 	help
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index 98cb6c5..0770916 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_CADENCE_TTC_TIMER)	+= cadence_ttc_timer.o
 obj-$(CONFIG_CLKSRC_EFM32)	+= time-efm32.o
 obj-$(CONFIG_CLKSRC_EXYNOS_MCT)	+= exynos_mct.o
 obj-$(CONFIG_CLKSRC_SAMSUNG_PWM)	+= samsung_pwm_timer.o
+obj-$(CONFIG_FSL_FTM_TIMER)	+= fsl_ftm_timer.o
 obj-$(CONFIG_VF_PIT_TIMER)	+= vf_pit_timer.o
 obj-$(CONFIG_CLKSRC_QCOM)	+= qcom-timer.o
 
diff --git a/drivers/clocksource/fsl_ftm_timer.c b/drivers/clocksource/fsl_ftm_timer.c
new file mode 100644
index 0000000..454227d
--- /dev/null
+++ b/drivers/clocksource/fsl_ftm_timer.c
@@ -0,0 +1,367 @@
+/*
+ * Freescale FlexTimer Module (FTM) timer driver.
+ *
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/sched_clock.h>
+#include <linux/slab.h>
+
+#define FTM_SC		0x00
+#define FTM_SC_CLK_SHIFT	3
+#define FTM_SC_CLK_MASK	(0x3 << FTM_SC_CLK_SHIFT)
+#define FTM_SC_CLK(c)	((c) << FTM_SC_CLK_SHIFT)
+#define FTM_SC_PS_MASK	0x7
+#define FTM_SC_TOIE	BIT(6)
+#define FTM_SC_TOF	BIT(7)
+
+#define FTM_CNT		0x04
+#define FTM_MOD		0x08
+#define FTM_CNTIN	0x4C
+
+#define FTM_PS_MAX	7
+
+struct ftm_clock_device {
+	void __iomem *clksrc_base;
+	void __iomem *clkevt_base;
+	unsigned long periodic_cyc;
+	unsigned long ps;
+	bool big_endian;
+};
+
+static struct ftm_clock_device *priv;
+
+static inline u32 ftm_readl(void __iomem *addr)
+{
+	if (priv->big_endian)
+		return ioread32be(addr);
+	else
+		return ioread32(addr);
+}
+
+static inline void ftm_writel(u32 val, void __iomem *addr)
+{
+	if (priv->big_endian)
+		iowrite32be(val, addr);
+	else
+		iowrite32(val, addr);
+}
+
+static inline void ftm_counter_enable(void __iomem *base)
+{
+	u32 val;
+
+	/* select and enable counter clock source */
+	val = ftm_readl(base + FTM_SC);
+	val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+	val |= priv->ps | FTM_SC_CLK(1);
+	ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_counter_disable(void __iomem *base)
+{
+	u32 val;
+
+	/* disable counter clock source */
+	val = ftm_readl(base + FTM_SC);
+	val &= ~(FTM_SC_PS_MASK | FTM_SC_CLK_MASK);
+	ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_acknowledge(void __iomem *base)
+{
+	u32 val;
+
+	val = ftm_readl(base + FTM_SC);
+	val &= ~FTM_SC_TOF;
+	ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_enable(void __iomem *base)
+{
+	u32 val;
+
+	val = ftm_readl(base + FTM_SC);
+	val |= FTM_SC_TOIE;
+	ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_irq_disable(void __iomem *base)
+{
+	u32 val;
+
+	val = ftm_readl(base + FTM_SC);
+	val &= ~FTM_SC_TOIE;
+	ftm_writel(val, base + FTM_SC);
+}
+
+static inline void ftm_reset_counter(void __iomem *base)
+{
+	/*
+	 * The CNT register contains the FTM counter value.
+	 * Reset clears the CNT register. Writing any value to COUNT
+	 * updates the counter with its initial value, CNTIN.
+	 */
+	ftm_writel(0x00, base + FTM_CNT);
+}
+
+static u64 ftm_read_sched_clock(void)
+{
+	return ftm_readl(priv->clksrc_base + FTM_CNT);
+}
+
+static int ftm_set_next_event(unsigned long delta,
+				struct clock_event_device *unused)
+{
+	/*
+	 * The CNNIN and MOD are all double buffer registers, writing
+	 * to the MOD register latches the value into a buffer. The MOD
+	 * register is updated with the value of its write buffer with
+	 * the following scenario:
+	 * a, the counter source clock is diabled.
+	 */
+	ftm_counter_disable(priv->clkevt_base);
+
+	/* Force the value of CNTIN to be loaded into the FTM counter */
+	ftm_reset_counter(priv->clkevt_base);
+
+	/*
+	 * The counter increments until the value of MOD is reached,
+	 * at which point the counter is reloaded with the value of CNTIN.
+	 * The TOF (the overflow flag) bit is set when the FTM counter
+	 * changes from MOD to CNTIN. So we should using the delta - 1.
+	 */
+	ftm_writel(delta - 1, priv->clkevt_base + FTM_MOD);
+
+	ftm_counter_enable(priv->clkevt_base);
+
+	ftm_irq_enable(priv->clkevt_base);
+
+	return 0;
+}
+
+static void ftm_set_mode(enum clock_event_mode mode,
+				struct clock_event_device *evt)
+{
+	switch (mode) {
+	case CLOCK_EVT_MODE_PERIODIC:
+		ftm_set_next_event(priv->periodic_cyc, evt);
+		break;
+	case CLOCK_EVT_MODE_ONESHOT:
+		ftm_counter_disable(priv->clkevt_base);
+		break;
+	default:
+		return;
+	}
+}
+
+static irqreturn_t ftm_evt_interrupt(int irq, void *dev_id)
+{
+	struct clock_event_device *evt = dev_id;
+
+	ftm_irq_acknowledge(priv->clkevt_base);
+
+	if (likely(evt->mode == CLOCK_EVT_MODE_ONESHOT)) {
+		ftm_irq_disable(priv->clkevt_base);
+		ftm_counter_disable(priv->clkevt_base);
+	}
+
+	evt->event_handler(evt);
+
+	return IRQ_HANDLED;
+}
+
+static struct clock_event_device ftm_clockevent = {
+	.name		= "Freescale ftm timer",
+	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+	.set_mode	= ftm_set_mode,
+	.set_next_event	= ftm_set_next_event,
+	.rating		= 300,
+};
+
+static struct irqaction ftm_timer_irq = {
+	.name		= "Freescale ftm timer",
+	.flags		= IRQF_TIMER | IRQF_IRQPOLL,
+	.handler	= ftm_evt_interrupt,
+	.dev_id		= &ftm_clockevent,
+};
+
+static int __init ftm_clockevent_init(unsigned long freq, int irq)
+{
+	int err;
+
+	ftm_writel(0x00, priv->clkevt_base + FTM_CNTIN);
+	ftm_writel(~0UL, priv->clkevt_base + FTM_MOD);
+
+	ftm_reset_counter(priv->clkevt_base);
+
+	err = setup_irq(irq, &ftm_timer_irq);
+	if (err) {
+		pr_err("ftm: setup irq failed: %d\n", err);
+		return err;
+	}
+
+	ftm_clockevent.cpumask = cpumask_of(0);
+	ftm_clockevent.irq = irq;
+
+	clockevents_config_and_register(&ftm_clockevent,
+					freq / (1 << priv->ps),
+					1, 0xffff);
+
+	ftm_counter_enable(priv->clkevt_base);
+
+	return 0;
+}
+
+static int __init ftm_clocksource_init(unsigned long freq)
+{
+	int err;
+
+	ftm_writel(0x00, priv->clksrc_base + FTM_CNTIN);
+	ftm_writel(~0UL, priv->clksrc_base + FTM_MOD);
+
+	ftm_reset_counter(priv->clksrc_base);
+
+	sched_clock_register(ftm_read_sched_clock, 16, freq / (1 << priv->ps));
+	err = clocksource_mmio_init(priv->clksrc_base + FTM_CNT, "fsl-ftm",
+				    freq / (1 << priv->ps), 300, 16,
+				    clocksource_mmio_readl_up);
+	if (err) {
+		pr_err("ftm: init clock source mmio failed: %d\n", err);
+		return err;
+	}
+
+	ftm_counter_enable(priv->clksrc_base);
+
+	return 0;
+}
+
+static int __init __ftm_clk_init(struct device_node *np, char *cnt_name,
+				 char *ftm_name)
+{
+	struct clk *clk;
+	int err;
+
+	clk = of_clk_get_by_name(np, cnt_name);
+	if (IS_ERR(clk)) {
+		pr_err("ftm: Cannot get \"%s\": %ld\n", cnt_name, PTR_ERR(clk));
+		return PTR_ERR(clk);
+	}
+	err = clk_prepare_enable(clk);
+	if (err) {
+		pr_err("ftm: clock failed to prepare+enable \"%s\": %d\n",
+			cnt_name, err);
+		return err;
+	}
+
+	clk = of_clk_get_by_name(np, ftm_name);
+	if (IS_ERR(clk)) {
+		pr_err("ftm: Cannot get \"%s\": %ld\n", ftm_name, PTR_ERR(clk));
+		return PTR_ERR(clk);
+	}
+	err = clk_prepare_enable(clk);
+	if (err)
+		pr_err("ftm: clock failed to prepare+enable \"%s\": %d\n",
+			ftm_name, err);
+
+	return clk_get_rate(clk);
+}
+
+static unsigned long __init ftm_clk_init(struct device_node *np)
+{
+	unsigned long freq;
+
+	freq = __ftm_clk_init(np, "ftm-evt-counter-en", "ftm-evt");
+	if (freq <= 0)
+		return 0;
+
+	freq = __ftm_clk_init(np, "ftm-src-counter-en", "ftm-src");
+	if (freq <= 0)
+		return 0;
+
+	return freq;
+}
+
+static int __init ftm_calc_closest_round_cyc(unsigned long freq)
+{
+	priv->ps = 0;
+
+	/* The counter register is only using the lower 16 bits, and
+	 * if the 'freq' value is to big here, then the periodic_cyc
+	 * may exceed 0xFFFF.
+	 */
+	do {
+		priv->periodic_cyc = DIV_ROUND_CLOSEST(freq,
+						HZ * (1 << priv->ps++));
+	} while (priv->periodic_cyc > 0xFFFF);
+
+	if (priv->ps > FTM_PS_MAX) {
+		pr_err("ftm: the prescaler is %lu > %d\n",
+				priv->ps, FTM_PS_MAX);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static void __init ftm_timer_init(struct device_node *np)
+{
+	unsigned long freq;
+	int irq;
+
+	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return;
+
+	priv->clkevt_base = of_iomap(np, 0);
+	if (!priv->clkevt_base) {
+		pr_err("ftm: unable to map event timer registers\n");
+		goto err;
+	}
+
+	priv->clksrc_base = of_iomap(np, 1);
+	if (!priv->clksrc_base) {
+		pr_err("ftm: unable to map source timer registers\n");
+		goto err;
+	}
+
+	irq = irq_of_parse_and_map(np, 0);
+	if (irq <= 0) {
+		pr_err("ftm: unable to get IRQ from DT, %d\n", irq);
+		goto err;
+	}
+
+	priv->big_endian = of_property_read_bool(np, "big-endian");
+
+	freq = ftm_clk_init(np);
+	if (!freq)
+		goto err;
+
+	if (ftm_calc_closest_round_cyc(freq))
+		goto err;
+
+	if (ftm_clocksource_init(freq))
+		goto err;
+
+	if (ftm_clockevent_init(freq, irq))
+		goto err;
+
+	return;
+
+err:
+	kfree(priv);
+}
+CLOCKSOURCE_OF_DECLARE(flextimer, "fsl,ftm-timer", ftm_timer_init);
-- 
1.7.9.5

  parent reply	other threads:[~2014-05-23 10:31 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-23 10:22 [GIT PULL] clockevents: new material for 3.16 Daniel Lezcano
2014-05-23 10:30 ` [PATCH 01/71] clocksource: sh_cmt: Use request_irq() instead of setup_irq() Daniel Lezcano
2014-05-23 10:30   ` [PATCH 02/71] clocksource: sh_cmt: Split channel fields from sh_cmt_priv Daniel Lezcano
2014-05-23 10:30   ` [PATCH 03/71] clocksource: sh_cmt: Rename struct sh_cmt_priv to sh_cmt_device Daniel Lezcano
2014-05-23 10:30   ` [PATCH 04/71] clocksource: sh_cmt: Split channel setup to separate function Daniel Lezcano
2014-05-23 10:30   ` [PATCH 05/71] clocksource: sh_cmt: Constify name argument to sh_cmt_register() Daniel Lezcano
2014-05-23 10:30   ` [PATCH 06/71] clocksource: sh_cmt: Rename mapbase/mapbase_str to mapbase_ch/mapbase Daniel Lezcano
2014-05-23 10:30   ` [PATCH 07/71] clocksource: sh_cmt: Add memory base to sh_cmt_channel structure Daniel Lezcano
2014-05-23 10:30   ` [PATCH 08/71] clocksource: sh_cmt: Add index to struct sh_cmt_channel Daniel Lezcano
2014-05-23 10:30   ` [PATCH 09/71] clocksource: sh_cmt: Replace kmalloc + memset with kzalloc Daniel Lezcano
2014-05-23 10:30   ` [PATCH 10/71] clocksource: sh_cmt: Allocate channels dynamically Daniel Lezcano
2014-05-23 10:30   ` [PATCH 11/71] clocksource: sh_cmt: Split static information from sh_cmt_device Daniel Lezcano
2014-05-23 10:30   ` [PATCH 12/71] clocksource: sh_cmt: Replace hardcoded register values with macros Daniel Lezcano
2014-05-23 10:30   ` [PATCH 13/71] clocksource: sh_cmt: Set cpumask to cpu_possible_mask Daniel Lezcano
2014-05-23 10:30   ` [PATCH 14/71] clocksource: sh_cmt: Hardcode CMT clock event rating to 125 Daniel Lezcano
2014-05-23 10:30   ` [PATCH 15/71] clocksource: sh_cmt: Hardcode CMT clock source " Daniel Lezcano
2014-05-23 10:30   ` [PATCH 16/71] clocksource: sh_cmt: Add support for multiple channels per device Daniel Lezcano
2014-05-23 10:30   ` [PATCH 17/71] clocksource: sh_cmt: Rename clock to "fck" in the non-legacy case Daniel Lezcano
2014-05-23 10:30   ` [PATCH 18/71] clocksource: sh_cmt: Remove FSF mail address from GPL notice Daniel Lezcano
2014-05-23 10:30   ` [PATCH 19/71] clocksource: sh_cmt: Sort headers alphabetically Daniel Lezcano
2014-05-23 10:31   ` [PATCH 20/71] clocksource: sh_cmt: Request IRQ for clock event device only Daniel Lezcano
2014-05-23 10:31   ` [PATCH 21/71] clocksource: sh_tmu: Use request_irq() instead of setup_irq() Daniel Lezcano
2014-05-23 10:31   ` [PATCH 22/71] clocksource: sh_tmu: Split channel fields from sh_tmu_priv Daniel Lezcano
2014-05-23 10:31   ` [PATCH 23/71] clocksource: sh_tmu: Rename struct sh_tmu_priv to sh_tmu_device Daniel Lezcano
2014-05-23 10:31   ` [PATCH 24/71] clocksource: sh_tmu: Split channel setup to separate function Daniel Lezcano
2014-05-23 10:31   ` [PATCH 25/71] clocksource: sh_tmu: Constify name argument to sh_tmu_register() Daniel Lezcano
2014-05-23 10:31   ` [PATCH 26/71] clocksource: sh_tmu: Add memory base to sh_tmu_channel structure Daniel Lezcano
2014-05-23 10:31   ` [PATCH 27/71] clocksource: sh_tmu: Add index to struct sh_tmu_channel Daniel Lezcano
2014-05-23 10:31   ` [PATCH 28/71] clocksource: sh_tmu: Replace kmalloc + memset with kzalloc Daniel Lezcano
2014-05-23 10:31   ` [PATCH 29/71] clocksource: sh_tmu: Allocate channels dynamically Daniel Lezcano
2014-05-23 10:31   ` [PATCH 30/71] clocksource: sh_tmu: Replace hardcoded register values with macros Daniel Lezcano
2014-05-23 10:31   ` [PATCH 31/71] clocksource: sh_tmu: Hardcode TMU clock event and source ratings to 200 Daniel Lezcano
2014-05-23 10:31   ` [PATCH 32/71] clocksource: sh_tmu: Add support for multiple channels per device Daniel Lezcano
2014-05-23 10:31   ` [PATCH 33/71] clocksource: sh_tmu: Rename clock to "fck" in the non-legacy case Daniel Lezcano
2014-05-23 10:31   ` [PATCH 34/71] clocksource: sh_tmu: Remove FSF mail address from GPL notice Daniel Lezcano
2014-05-23 10:31   ` [PATCH 35/71] clocksource: sh_tmu: Sort headers alphabetically Daniel Lezcano
2014-05-23 10:31   ` [PATCH 36/71] clocksource: sh_mtu2: Use request_irq() instead of setup_irq() Daniel Lezcano
2014-05-23 10:31   ` [PATCH 37/71] clocksource: sh_mtu2: Turn sh_mtu2_priv fields into local variables Daniel Lezcano
2014-05-23 10:31   ` [PATCH 38/71] clocksource: sh_mtu2: Split channel fields from sh_mtu2_priv Daniel Lezcano
2014-05-23 10:31   ` [PATCH 39/71] clocksource: sh_mtu2: Rename struct sh_mtu2_priv to sh_mtu2_device Daniel Lezcano
2014-05-23 10:31   ` [PATCH 40/71] clocksource: sh_mtu2: Split channel setup to separate function Daniel Lezcano
2014-05-23 10:31   ` [PATCH 41/71] clocksource: sh_mtu2: Constify name argument to sh_mtu2_register() Daniel Lezcano
2014-05-23 10:31   ` [PATCH 42/71] clocksource: sh_mtu2: Add memory base to sh_mtu2_channel structure Daniel Lezcano
2014-05-23 10:31   ` [PATCH 43/71] clocksource: sh_mtu2: Add index to struct sh_mtu2_channel Daniel Lezcano
2014-05-23 10:31   ` [PATCH 44/71] clocksource: sh_mtu2: Replace kmalloc + memset with kzalloc Daniel Lezcano
2014-05-23 10:31   ` [PATCH 45/71] clocksource: sh_mtu2: Allocate channels dynamically Daniel Lezcano
2014-05-23 10:31   ` [PATCH 46/71] clocksource: sh_mtu2: Replace hardcoded register values with macros Daniel Lezcano
2014-05-23 10:31   ` [PATCH 47/71] clocksource: sh_mtu2: Set cpumask to cpu_possible_mask Daniel Lezcano
2014-05-23 10:31   ` [PATCH 48/71] clocksource: sh_mtu2: Hardcode MTU2 clock event rating to 200 Daniel Lezcano
2014-05-23 10:31   ` [PATCH 49/71] clocksource: sh_mtu2: Add support for multiple channels per device Daniel Lezcano
2014-05-23 10:31   ` [PATCH 50/71] clocksource: sh_mtu2: Rename clock to "fck" in the non-legacy case Daniel Lezcano
2014-05-23 10:31   ` [PATCH 51/71] clocksource: sh_mtu2: Remove FSF mail address from GPL notice Daniel Lezcano
2014-05-23 10:31   ` [PATCH 52/71] clocksource: sh_mtu2: Sort headers alphabetically Daniel Lezcano
2014-05-23 10:31   ` [PATCH 53/71] clocksource: arm_global_timer: Only check for unusable timer on A9 Daniel Lezcano
2014-05-23 10:31   ` [PATCH 54/71] documentaion: DT: allow a A5 compatible string in global timer Daniel Lezcano
2014-05-23 10:31   ` [PATCH 55/71] dts: ca5: add the global timer for the A5 Daniel Lezcano
2014-05-23 10:31   ` [PATCH 56/71] KConfig: Vexpress: build the ARM_GLOBAL_TIMER with vexpress platform Daniel Lezcano
2014-05-23 10:31   ` [PATCH 57/71] clocksource: efm32: use $vendor, $device scheme for compatible string Daniel Lezcano
2014-05-23 10:31   ` [PATCH 58/71] clocksource: sun5i: Add support for reset controller Daniel Lezcano
2014-05-23 10:31   ` [PATCH 59/71] ARM: sun6i: a31: Add support for the High Speed Timers Daniel Lezcano
2014-05-23 10:31   ` [PATCH 60/71] clocksource: qcom: Implement read_current_timer for udelay Daniel Lezcano
2014-05-23 10:31   ` [PATCH 61/71] clocksource: sh_tmu: Fix channel IRQ retrieval in legacy case Daniel Lezcano
2014-05-23 10:31   ` [PATCH 62/71] clocksource: Fix type confusion for clocksource_mmio_readX_Y Daniel Lezcano
2014-05-23 10:31   ` [PATCH 63/71] clocksource: Fix clocksource_mmio_readX_down Daniel Lezcano
2014-05-23 10:31   ` [PATCH 64/71] clocksource: dw_apb_timer_of: Do not trace read_sched_clock Daniel Lezcano
2014-05-23 10:31   ` [PATCH 65/71] clocksource: em_sti: Remove unnecessary OOM messages Daniel Lezcano
2014-05-23 10:31   ` [PATCH 66/71] clocksource: sh_cmt: " Daniel Lezcano
2014-05-23 10:31   ` [PATCH 67/71] clocksource: sh_mtu2: " Daniel Lezcano
2014-05-23 10:31   ` [PATCH 68/71] clocksource: sh_tmu: " Daniel Lezcano
2014-05-23 10:31   ` [PATCH 69/71] clocksource: ftm: Add FlexTimer Module (FTM) Timer devicetree Documentation Daniel Lezcano
2014-05-23 10:31   ` [PATCH 70/71] ARM: dts: vf610: Add Freescale FlexTimer Module timer node Daniel Lezcano
2014-05-23 10:31   ` Daniel Lezcano [this message]
     [not found] ` <20140526194512.032c6630@canb.auug.org.au>
2014-05-26  9:52   ` [GIT PULL] clockevents: new material for 3.16 Daniel Lezcano
2014-05-26 13:40     ` Maxime Ripard
2014-05-26 15:07       ` Philipp Zabel

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=1400841111-6683-71-git-send-email-daniel.lezcano@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=linux-arm-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).