linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] clocksource/drivers: Add timer-of common init routine
@ 2017-06-06 12:44 Daniel Lezcano
  2017-06-06 12:44 ` [PATCH 2/2] clocksource/drivers/keystone: Use the timer-of common routine Daniel Lezcano
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Daniel Lezcano @ 2017-06-06 12:44 UTC (permalink / raw)
  To: tglx; +Cc: linux-arm-kernel, linux-kernel

The different drivers are all using the same pattern when initializing.

 1. Get the base address
 2. Get the irq number
 3. Get the clock
 4. Prepare and enable the clock
 5. Get the rate
 6. Request an interrupt

Instead of repeating again and again these steps in all the drivers, let's
provide a common init routine to give the opportunity to factor all of them
out.

We can expect a significant kernel size improvement when the common routine
will be used in all the drivers.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/clocksource/Makefile   |   1 +
 drivers/clocksource/timer-of.c | 168 +++++++++++++++++++++++++++++++++++++++++
 drivers/clocksource/timer-of.h |  67 ++++++++++++++++
 3 files changed, 236 insertions(+)
 create mode 100644 drivers/clocksource/timer-of.c
 create mode 100644 drivers/clocksource/timer-of.h

diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index ec55921..72bfd00 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -1,3 +1,4 @@
+obj-$(CONFIG_TIMER_OF)		+= timer-of.o
 obj-$(CONFIG_TIMER_PROBE)	+= timer-probe.o
 obj-$(CONFIG_ATMEL_PIT)		+= timer-atmel-pit.o
 obj-$(CONFIG_ATMEL_ST)		+= timer-atmel-st.o
diff --git a/drivers/clocksource/timer-of.c b/drivers/clocksource/timer-of.c
new file mode 100644
index 0000000..f25dc72
--- /dev/null
+++ b/drivers/clocksource/timer-of.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2017, Linaro Ltd.  All rights reserved.
+ *
+ * Author: Daniel Lezcano <daniel.lezcano@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include <linux/clk.h>
+#include <linux/interrupt.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/slab.h>
+
+#include "timer-of.h"
+
+static __init void timer_irq_exit(struct of_timer_irq *of_irq)
+{
+	struct timer_of *to = container_of(of_irq, struct timer_of, of_irq);
+
+	struct clock_event_device *clkevt = &to->clkevt;
+
+	of_irq->percpu ? free_percpu_irq(of_irq->irq, clkevt) :
+		free_irq(of_irq->irq, clkevt);
+}
+
+static __init int timer_irq_init(struct device_node *np,
+				 struct of_timer_irq *of_irq)
+{
+	int ret;
+	struct timer_of *to = container_of(of_irq, struct timer_of, of_irq);
+	struct clock_event_device *clkevt = &to->clkevt;
+
+	of_irq->irq = of_irq->name ? of_irq_get_byname(np, of_irq->name):
+		irq_of_parse_and_map(np, of_irq->index);
+	if (!of_irq->irq) {
+		pr_err("Failed to map interrupt for %s\n", np->full_name);
+		return -EINVAL;
+	}
+
+	ret = of_irq->percpu ?
+		request_percpu_irq(of_irq->irq, of_irq->handler,
+				   np->full_name, clkevt) :
+		request_irq(of_irq->irq, of_irq->handler, IRQF_TIMER,
+			    np->full_name, clkevt);
+	if (ret) {
+		pr_err("Failed to request irq %d for %s\n", of_irq->irq,
+		       np->full_name);
+		return ret;
+	}
+
+	clkevt->irq = of_irq->irq;
+
+	return 0;
+}
+
+static __init void timer_clk_exit(struct of_timer_clk *of_clk)
+{
+	of_clk->rate = 0;
+	clk_disable_unprepare(of_clk->clk);
+	clk_put(of_clk->clk);
+}
+
+static __init int timer_clk_init(struct device_node *np,
+				 struct of_timer_clk *of_clk)
+{
+	int ret;
+
+	of_clk->clk = of_clk->name ? of_clk_get_by_name(np, of_clk->name) :
+		of_clk_get(np, of_clk->index);
+	if (IS_ERR(of_clk->clk)) {
+		pr_err("Failed to get clock for %s\n", np->full_name);
+		return PTR_ERR(of_clk->clk);
+	}
+
+	ret = clk_prepare_enable(of_clk->clk);
+	if (ret) {
+		pr_err("Failed for enable clock for %s\n", np->full_name);
+		goto out_clk_put;
+	}
+
+	of_clk->rate = clk_get_rate(of_clk->clk);
+	if (!of_clk->rate) {
+		ret = -EINVAL;
+		pr_err("Failed to get clock rate for %s\n", np->full_name);
+		goto out_clk_disable;
+	}
+
+	of_clk->period = DIV_ROUND_UP(of_clk->rate, HZ);
+out:
+	return ret;
+
+out_clk_disable:
+	clk_disable_unprepare(of_clk->clk);
+out_clk_put:
+	clk_put(of_clk->clk);
+
+	goto out;
+}
+
+static __init void timer_base_exit(struct of_timer_base *of_base)
+{
+	iounmap(of_base->base);
+}
+
+static __init int timer_base_init(struct device_node *np,
+				  struct of_timer_base *of_base)
+{
+	const char *name = of_base->name ? of_base->name : np->full_name;
+
+	of_base->base = of_io_request_and_map(np, of_base->index, name);
+	if (of_base->base) {
+		pr_err("Failed to iomap (%s)\n", name);
+		return -ENXIO;
+	}
+
+	return 0;
+}
+
+int __init timer_of_init(struct device_node *np, struct timer_of *to)
+{
+	int ret;
+	int flags = 0;
+
+	if (to->flags & TIMER_OF_BASE) {
+		ret = timer_base_init(np, &to->of_base);
+		if (ret)
+			goto out_fail;
+		flags |= TIMER_OF_BASE;
+	}
+
+	if (to->flags & TIMER_OF_CLOCK) {
+		ret = timer_clk_init(np, &to->of_clk);
+		if (ret)
+			goto out_fail;
+		flags |= TIMER_OF_CLOCK;
+	}
+
+	if (to->flags & TIMER_OF_IRQ) {
+		ret = timer_irq_init(np, &to->of_irq);
+		if (ret)
+			goto out_fail;
+		flags |= TIMER_OF_IRQ;
+	}
+out:
+	return ret;
+
+out_fail:
+	if (flags & TIMER_OF_IRQ)
+		timer_irq_exit(&to->of_irq);
+
+	if (flags & TIMER_OF_CLOCK)
+		timer_clk_exit(&to->of_clk);
+
+	if (flags & TIMER_OF_BASE)
+		timer_base_exit(&to->of_base);
+	goto out;
+}
diff --git a/drivers/clocksource/timer-of.h b/drivers/clocksource/timer-of.h
new file mode 100644
index 0000000..70b55aee
--- /dev/null
+++ b/drivers/clocksource/timer-of.h
@@ -0,0 +1,67 @@
+#ifndef __TIMER_OF_H__
+#define __TIMER_OF_H__
+
+#include <linux/clockchips.h>
+
+#define TIMER_OF_BASE	0x1
+#define TIMER_OF_CLOCK	0x2
+#define TIMER_OF_IRQ	0x4
+
+struct of_timer_irq {
+	int irq;
+	int index;
+	int percpu;
+	const char *name;
+	irq_handler_t handler;
+};
+
+struct of_timer_base {
+	void __iomem *base;
+	const char *name;
+	int index;
+};
+
+struct of_timer_clk {
+	struct clk *clk;
+	const char *name;
+	int index;
+	unsigned long rate;
+	unsigned long period;
+};
+
+struct timer_of {
+	unsigned int flags;
+	struct clock_event_device clkevt;
+	struct of_timer_base of_base;
+	struct of_timer_irq  of_irq;
+	struct of_timer_clk  of_clk;
+};
+
+static inline struct timer_of *to_timer_of(struct clock_event_device *clkevt)
+{
+	return container_of(clkevt, struct timer_of, clkevt);
+}
+
+static inline void __iomem *timer_of_base(struct timer_of *to)
+{
+	return to->of_base.base;
+}
+
+static inline int timer_of_irq(struct timer_of *to)
+{
+	return to->of_irq.irq;
+}
+
+static inline unsigned long timer_of_rate(struct timer_of *to)
+{
+	return to->of_clk.rate;
+}
+
+static inline unsigned long timer_of_period(struct timer_of *to)
+{
+	return to->of_clk.period;
+}
+
+extern int __init timer_of_init(struct device_node *np,
+				struct timer_of *to);
+#endif
-- 
2.7.4

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

* [PATCH 2/2] clocksource/drivers/keystone: Use the timer-of common routine
  2017-06-06 12:44 [PATCH 1/2] clocksource/drivers: Add timer-of common init routine Daniel Lezcano
@ 2017-06-06 12:44 ` Daniel Lezcano
  2017-06-06 21:55 ` [PATCH 1/2] clocksource/drivers: Add timer-of common init routine kbuild test robot
  2017-06-08  4:33 ` kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Daniel Lezcano @ 2017-06-06 12:44 UTC (permalink / raw)
  To: tglx; +Cc: linux-arm-kernel, linux-kernel, Santosh Shilimkar

The previous patch provided a common init routine for the OF drivers.

The keystone driver is given as example on the improvement and usage of the
common initialization routine.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/clocksource/Kconfig          |   1 +
 drivers/clocksource/timer-keystone.c | 117 +++++++++++++----------------------
 2 files changed, 44 insertions(+), 74 deletions(-)

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 4ba230d..f1ed520 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -216,6 +216,7 @@ config KEYSTONE_TIMER
 	depends on GENERIC_CLOCKEVENTS
 	depends on ARM || ARM64
 	select CLKSRC_MMIO
+	select TIMER_OF
 	help
 	  Enables support for the Keystone timer.
 
diff --git a/drivers/clocksource/timer-keystone.c b/drivers/clocksource/timer-keystone.c
index 0eee032..84b2523 100644
--- a/drivers/clocksource/timer-keystone.c
+++ b/drivers/clocksource/timer-keystone.c
@@ -18,6 +18,8 @@
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
+#include "timer-of.h"
+
 #define TIMER_NAME			"timer-keystone"
 
 /* Timer register offsets */
@@ -37,26 +39,16 @@
 #define TGCR_TIM_UNRESET_MASK		0x03
 #define INTCTLSTAT_ENINT_MASK		0x01
 
-/**
- * struct keystone_timer: holds timer's data
- * @base: timer memory base address
- * @hz_period: cycles per HZ period
- * @event_dev: event device based on timer
- */
-static struct keystone_timer {
-	void __iomem *base;
-	unsigned long hz_period;
-	struct clock_event_device event_dev;
-} timer;
+static struct timer_of to;
 
 static inline u32 keystone_timer_readl(unsigned long rg)
 {
-	return readl_relaxed(timer.base + rg);
+	return readl_relaxed(timer_of_base(&to) + rg);
 }
 
 static inline void keystone_timer_writel(u32 val, unsigned long rg)
 {
-	writel_relaxed(val, timer.base + rg);
+	writel_relaxed(val, timer_of_base(&to) + rg);
 }
 
 /**
@@ -123,6 +115,7 @@ static irqreturn_t keystone_timer_interrupt(int irq, void *dev_id)
 	struct clock_event_device *evt = dev_id;
 
 	evt->event_handler(evt);
+
 	return IRQ_HANDLED;
 }
 
@@ -140,43 +133,42 @@ static int keystone_shutdown(struct clock_event_device *evt)
 
 static int keystone_set_periodic(struct clock_event_device *evt)
 {
-	keystone_timer_config(timer.hz_period, TCR_ENAMODE_PERIODIC_MASK);
+	struct timer_of *to = to_timer_of(evt);
+
+	keystone_timer_config(timer_of_period(to), TCR_ENAMODE_PERIODIC_MASK);
+
 	return 0;
 }
 
+static struct timer_of to = {
+	.flags = TIMER_OF_IRQ |
+		TIMER_OF_CLOCK |
+		TIMER_OF_BASE,
+
+	.clkevt = {
+		.features = CLOCK_EVT_FEAT_PERIODIC |
+			CLOCK_EVT_FEAT_ONESHOT,
+		.set_next_event = keystone_set_next_event,
+		.set_state_shutdown = keystone_shutdown,
+		.set_state_periodic = keystone_set_periodic,
+		.set_state_oneshot = keystone_shutdown,
+		.cpumask = cpu_all_mask,
+		.owner = THIS_MODULE,
+		.name = TIMER_NAME,
+	},
+
+	.of_irq = {
+		.handler = keystone_timer_interrupt,
+	},
+};
+
 static int __init keystone_timer_init(struct device_node *np)
 {
-	struct clock_event_device *event_dev = &timer.event_dev;
-	unsigned long rate;
-	struct clk *clk;
-	int irq, error;
-
-	irq  = irq_of_parse_and_map(np, 0);
-	if (!irq) {
-		pr_err("%s: failed to map interrupts\n", __func__);
-		return -EINVAL;
-	}
-
-	timer.base = of_iomap(np, 0);
-	if (!timer.base) {
-		pr_err("%s: failed to map registers\n", __func__);
-		return -ENXIO;
-	}
-
-	clk = of_clk_get(np, 0);
-	if (IS_ERR(clk)) {
-		pr_err("%s: failed to get clock\n", __func__);
-		iounmap(timer.base);
-		return PTR_ERR(clk);
-	}
-
-	error = clk_prepare_enable(clk);
-	if (error) {
-		pr_err("%s: failed to enable clock\n", __func__);
-		goto err;
-	}
-
-	rate = clk_get_rate(clk);
+	int ret;
+
+	ret = timer_of_init(np, &to);
+	if (ret)
+		return ret;
 
 	/* disable, use internal clock source */
 	keystone_timer_writel(0, TCR);
@@ -193,38 +185,15 @@ static int __init keystone_timer_init(struct device_node *np)
 	keystone_timer_writel(0, TIM12);
 	keystone_timer_writel(0, TIM34);
 
-	timer.hz_period = DIV_ROUND_UP(rate, HZ);
-
 	/* enable timer interrupts */
 	keystone_timer_writel(INTCTLSTAT_ENINT_MASK, INTCTLSTAT);
 
-	error = request_irq(irq, keystone_timer_interrupt, IRQF_TIMER,
-			    TIMER_NAME, event_dev);
-	if (error) {
-		pr_err("%s: failed to setup irq\n", __func__);
-		goto err;
-	}
-
-	/* setup clockevent */
-	event_dev->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
-	event_dev->set_next_event = keystone_set_next_event;
-	event_dev->set_state_shutdown = keystone_shutdown;
-	event_dev->set_state_periodic = keystone_set_periodic;
-	event_dev->set_state_oneshot = keystone_shutdown;
-	event_dev->cpumask = cpu_all_mask;
-	event_dev->owner = THIS_MODULE;
-	event_dev->name = TIMER_NAME;
-	event_dev->irq = irq;
-
-	clockevents_config_and_register(event_dev, rate, 1, ULONG_MAX);
-
-	pr_info("keystone timer clock @%lu Hz\n", rate);
+	clockevents_config_and_register(&to.clkevt, timer_of_rate(&to),
+					1, ULONG_MAX);
+
+	pr_info("keystone timer clock @%lu Hz\n", timer_of_rate(&to));
+
 	return 0;
-err:
-	clk_put(clk);
-	iounmap(timer.base);
-	return error;
 }
 
-TIMER_OF_DECLARE(keystone_timer, "ti,keystone-timer",
-			   keystone_timer_init);
+TIMER_OF_DECLARE(keystone_timer, "ti,keystone-timer", keystone_timer_init);
-- 
2.7.4

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

* Re: [PATCH 1/2] clocksource/drivers: Add timer-of common init routine
  2017-06-06 12:44 [PATCH 1/2] clocksource/drivers: Add timer-of common init routine Daniel Lezcano
  2017-06-06 12:44 ` [PATCH 2/2] clocksource/drivers/keystone: Use the timer-of common routine Daniel Lezcano
@ 2017-06-06 21:55 ` kbuild test robot
  2017-06-08  4:33 ` kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kbuild test robot @ 2017-06-06 21:55 UTC (permalink / raw)
  To: Daniel Lezcano; +Cc: kbuild-all, tglx, linux-arm-kernel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3250 bytes --]

Hi Daniel,

[auto build test ERROR on next-20170605]
[cannot apply to tip/timers/core clk/clk-next linus/master v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.12-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Daniel-Lezcano/clocksource-drivers-Add-timer-of-common-init-routine/20170607-024801
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 6.2.0
reproduce:
        wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=ia64 

All error/warnings (new ones prefixed by >>):

   In file included from drivers/clocksource/timer-of.c:25:0:
>> drivers/clocksource/timer-of.h:34:28: error: field 'clkevt' has incomplete type
     struct clock_event_device clkevt;
                               ^~~~~~
   In file included from include/linux/err.h:4:0,
                    from include/linux/clk.h:15,
                    from drivers/clocksource/timer-of.c:18:
   drivers/clocksource/timer-of.h: In function 'to_timer_of':
   include/linux/kernel.h:859:32: error: dereferencing pointer to incomplete type 'struct clock_event_device'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                   ^~~~~~
   include/linux/compiler.h:517:19: note: in definition of macro '__compiletime_assert'
      bool __cond = !(condition);    \
                      ^~~~~~~~~
   include/linux/compiler.h:537:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:46:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:859:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:859:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
>> drivers/clocksource/timer-of.h:42:9: note: in expansion of macro 'container_of'
     return container_of(clkevt, struct timer_of, clkevt);
            ^~~~~~~~~~~~

vim +/clkevt +34 drivers/clocksource/timer-of.h

    28		unsigned long rate;
    29		unsigned long period;
    30	};
    31	
    32	struct timer_of {
    33		unsigned int flags;
  > 34		struct clock_event_device clkevt;
    35		struct of_timer_base of_base;
    36		struct of_timer_irq  of_irq;
    37		struct of_timer_clk  of_clk;
    38	};
    39	
    40	static inline struct timer_of *to_timer_of(struct clock_event_device *clkevt)
    41	{
  > 42		return container_of(clkevt, struct timer_of, clkevt);
    43	}
    44	
    45	static inline void __iomem *timer_of_base(struct timer_of *to)

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 47902 bytes --]

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

* Re: [PATCH 1/2] clocksource/drivers: Add timer-of common init routine
  2017-06-06 12:44 [PATCH 1/2] clocksource/drivers: Add timer-of common init routine Daniel Lezcano
  2017-06-06 12:44 ` [PATCH 2/2] clocksource/drivers/keystone: Use the timer-of common routine Daniel Lezcano
  2017-06-06 21:55 ` [PATCH 1/2] clocksource/drivers: Add timer-of common init routine kbuild test robot
@ 2017-06-08  4:33 ` kbuild test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kbuild test robot @ 2017-06-08  4:33 UTC (permalink / raw)
  To: Daniel Lezcano; +Cc: kbuild-all, tglx, linux-arm-kernel, linux-kernel

Hi Daniel,

[auto build test WARNING on next-20170605]
[cannot apply to tip/timers/core clk/clk-next linus/master v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.12-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Daniel-Lezcano/clocksource-drivers-Add-timer-of-common-init-routine/20170607-024801
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   include/linux/compiler.h:260:8: sparse: attribute 'no_sanitize_address': unknown attribute
>> drivers/clocksource/timer-of.c:33:24: sparse: incompatible types in conditional expression (different types)

vim +33 drivers/clocksource/timer-of.c

    17	 */
    18	#include <linux/clk.h>
    19	#include <linux/interrupt.h>
    20	#include <linux/of.h>
    21	#include <linux/of_address.h>
    22	#include <linux/of_irq.h>
    23	#include <linux/slab.h>
    24	
    25	#include "timer-of.h"
    26	
    27	static __init void timer_irq_exit(struct of_timer_irq *of_irq)
    28	{
    29		struct timer_of *to = container_of(of_irq, struct timer_of, of_irq);
    30	
    31		struct clock_event_device *clkevt = &to->clkevt;
    32	
  > 33		of_irq->percpu ? free_percpu_irq(of_irq->irq, clkevt) :
    34			free_irq(of_irq->irq, clkevt);
    35	}
    36	
    37	static __init int timer_irq_init(struct device_node *np,
    38					 struct of_timer_irq *of_irq)
    39	{
    40		int ret;
    41		struct timer_of *to = container_of(of_irq, struct timer_of, of_irq);

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

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

end of thread, other threads:[~2017-06-08  4:34 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-06 12:44 [PATCH 1/2] clocksource/drivers: Add timer-of common init routine Daniel Lezcano
2017-06-06 12:44 ` [PATCH 2/2] clocksource/drivers/keystone: Use the timer-of common routine Daniel Lezcano
2017-06-06 21:55 ` [PATCH 1/2] clocksource/drivers: Add timer-of common init routine kbuild test robot
2017-06-08  4:33 ` kbuild test robot

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).