All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	u.kleine-koenig@pengutronix.de, afaerber@suse.de,
	geert@linux-m68k.org, Rob Herring <robh+dt@kernel.org>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Linus Walleij <linus.walleij@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>,
	stefan@agner.ch, pmeerw@pmeerw.net, pebolle@tiscali.nl,
	peter@hurleysoftware.com, andy.shevchenko@gmail.com,
	cw00.choi@samsung.com, Russell King <linux@arm.linux.org.uk>,
	joe@perches.com,
	Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>,
	lee.jones@linaro.org,
	Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jonathan Corbet <corbet@lwn.net>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jslaby@suse.cz>,
	Andrew Morton <akpm@linux-foundation.org>,
	"David S. Miller" <davem@davemloft.net>,
	Mauro Carvalho Chehab <mchehab@osg.samsung.com>,
	Antti Palosaari <crope@iki.fi>, Tejun Heo <tj@kernel.org>,
	Will Deacon <will.deacon@arm.com>,
	Nikolay Borisov <Nikolay.Borisov@arm.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Kees Cook <keescook@chromium.org>, Michal Marek <mmarek@suse.cz>,
	linux-doc@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-gpio@vger.kernel.org, linux-serial@vger.kernel.org,
	linux-arch@vger.kerne
Subject: Re: [PATCH v8 09/16] clockevents/drivers: Add STM32 Timer driver
Date: Mon, 18 May 2015 15:10:08 +0200	[thread overview]
Message-ID: <5559E4B0.70506@linaro.org> (raw)
In-Reply-To: <1431158038-3813-10-git-send-email-mcoquelin.stm32@gmail.com>

On 05/09/2015 09:53 AM, Maxime Coquelin wrote:
> STM32 MCUs feature 16 and 32 bits general purpose timers with prescalers.
> The drivers detects whether the time is 16 or 32 bits, and applies a
> 1024 prescaler value if it is 16 bits.
>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
> Signed-off-by: Maxime Coquelin <mcoquelin.stm32@gmail.com>
> ---
>   drivers/clocksource/Kconfig       |   8 ++
>   drivers/clocksource/Makefile      |   1 +
>   drivers/clocksource/timer-stm32.c | 184 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 193 insertions(+)
>   create mode 100644 drivers/clocksource/timer-stm32.c
>
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index bf9364c..2443520 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -106,6 +106,14 @@ config CLKSRC_EFM32
>   	  Support to use the timers of EFM32 SoCs as clock source and clock
>   	  event device.
>
> +config CLKSRC_STM32
> +	bool "Clocksource for STM32 SoCs" if !ARCH_STM32
> +	depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)

Are the interactive bool and the 'COMPILE_TEST' necessary ?


> +	select CLKSRC_MMIO
> +	default ARCH_STM32
> +	help
> +	  Support to use the timers of STM32 SoCs as clock event device.
> +
>   config ARM_ARCH_TIMER
>   	bool
>   	select CLKSRC_OF if OF
> diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
> index d510c54..888a7df 100644
> --- a/drivers/clocksource/Makefile
> +++ b/drivers/clocksource/Makefile
> @@ -36,6 +36,7 @@ obj-$(CONFIG_ARCH_NSPIRE)	+= zevio-timer.o
>   obj-$(CONFIG_ARCH_BCM_MOBILE)	+= bcm_kona_timer.o
>   obj-$(CONFIG_CADENCE_TTC_TIMER)	+= cadence_ttc_timer.o
>   obj-$(CONFIG_CLKSRC_EFM32)	+= time-efm32.o
> +obj-$(CONFIG_CLKSRC_STM32)	+= timer-stm32.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
> diff --git a/drivers/clocksource/timer-stm32.c b/drivers/clocksource/timer-stm32.c
> new file mode 100644
> index 0000000..fad2e2e
> --- /dev/null
> +++ b/drivers/clocksource/timer-stm32.c
> @@ -0,0 +1,184 @@
> +/*
> + * Copyright (C) Maxime Coquelin 2015
> + * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
> + * License terms:  GNU General Public License (GPL), version 2
> + *
> + * Inspired by time-efm32.c from Uwe Kleine-Koenig
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/clocksource.h>
> +#include <linux/clockchips.h>
> +#include <linux/irq.h>
> +#include <linux/interrupt.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_irq.h>
> +#include <linux/clk.h>
> +#include <linux/reset.h>
> +
> +#define TIM_CR1		0x00
> +#define TIM_DIER	0x0c
> +#define TIM_SR		0x10
> +#define TIM_EGR		0x14
> +#define TIM_PSC		0x28
> +#define TIM_ARR		0x2c
> +
> +#define TIM_CR1_CEN	BIT(0)
> +#define TIM_CR1_OPM	BIT(3)
> +#define TIM_CR1_ARPE	BIT(7)
> +
> +#define TIM_DIER_UIE	BIT(0)
> +
> +#define TIM_SR_UIF	BIT(0)
> +
> +#define TIM_EGR_UG	BIT(0)
> +
> +struct stm32_clock_event_ddata {
> +	struct clock_event_device evtdev;
> +	unsigned periodic_top;
> +	void __iomem *base;
> +};
> +
> +static void stm32_clock_event_set_mode(enum clock_event_mode mode,
> +				       struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +	void *base = data->base;
> +
> +	switch (mode) {
> +	case CLOCK_EVT_MODE_PERIODIC:
> +		writel_relaxed(data->periodic_top, base + TIM_ARR);
> +		writel_relaxed(TIM_CR1_ARPE | TIM_CR1_CEN, base + TIM_CR1);
> +		break;
> +
> +	case CLOCK_EVT_MODE_ONESHOT:
> +	default:
> +		writel_relaxed(0, base + TIM_CR1);
> +		break;
> +	}
> +}
> +
> +static int stm32_clock_event_set_next_event(unsigned long evt,
> +					    struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +
> +	writel_relaxed(evt, data->base + TIM_ARR);
> +	writel_relaxed(TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_CEN,
> +		       data->base + TIM_CR1);
> +
> +	return 0;
> +}
> +
> +static irqreturn_t stm32_clock_event_handler(int irq, void *dev_id)
> +{
> +	struct stm32_clock_event_ddata *data = dev_id;
> +
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->evtdev.event_handler(&data->evtdev);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static struct stm32_clock_event_ddata clock_event_ddata = {
> +	.evtdev = {
> +		.name = "stm32 clockevent",
> +		.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
> +		.set_mode = stm32_clock_event_set_mode,
> +		.set_next_event = stm32_clock_event_set_next_event,
> +		.rating = 200,
> +	},
> +};
> +
> +static void __init stm32_clockevent_init(struct device_node *np)
> +{
> +	struct stm32_clock_event_ddata *data = &clock_event_ddata;
> +	struct clk *clk;
> +	struct reset_control *rstc;
> +	unsigned long rate, max_delta;
> +	int irq, ret, bits, prescaler = 1;
> +
> +	clk = of_clk_get(np, 0);
> +	if (IS_ERR(clk)) {
> +		ret = PTR_ERR(clk);
> +		pr_err("failed to get clock for clockevent (%d)\n", ret);
> +		goto err_clk_get;
> +	}
> +
> +	ret = clk_prepare_enable(clk);
> +	if (ret) {
> +		pr_err("failed to enable timer clock for clockevent (%d)\n",
> +		       ret);
> +		goto err_clk_enable;
> +	}
> +
> +	rate = clk_get_rate(clk);
> +
> +	rstc = of_reset_control_get(np, NULL);
> +	if (!IS_ERR(rstc)) {
> +		reset_control_assert(rstc);
> +		reset_control_deassert(rstc);
> +	}
> +
> +	data->base = of_iomap(np, 0);
> +	if (!data->base) {
> +		pr_err("failed to map registers for clockevent\n");
> +		goto err_iomap;
> +	}
> +
> +	irq = irq_of_parse_and_map(np, 0);
> +	if (!irq) {
> +		pr_err("%s: failed to get irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	/* Detect whether the timer is 16 or 32 bits */
> +	writel_relaxed(~0UL, data->base + TIM_ARR);
> +	max_delta = readl_relaxed(data->base + TIM_ARR);
> +	if (max_delta == ~0UL) {
> +		prescaler = 1;
> +		bits = 32;
> +	} else {
> +		prescaler = 1024;
> +		bits = 16;
> +	}
> +	writel_relaxed(0, data->base + TIM_ARR);
> +
> +	writel_relaxed(prescaler - 1, data->base + TIM_PSC);
> +	writel_relaxed(TIM_EGR_UG, data->base + TIM_EGR);
> +	writel_relaxed(TIM_DIER_UIE, data->base + TIM_DIER);
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->periodic_top = DIV_ROUND_CLOSEST(rate, prescaler * HZ);
> +
> +	clockevents_config_and_register(&data->evtdev,
> +					DIV_ROUND_CLOSEST(rate, prescaler),
> +					0x1, max_delta);
> +
> +	ret = request_irq(irq, stm32_clock_event_handler, IRQF_TIMER,
> +			"stm32 clockevent", data);
> +	if (ret) {
> +		pr_err("%s: failed to request irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	pr_info("%s: STM32 clockevent driver initialized (%d bits)\n",
> +			np->full_name, bits);
> +
> +	return;
> +
> +err_get_irq:
> +	iounmap(data->base);
> +err_iomap:
> +	clk_disable_unprepare(clk);
> +err_clk_enable:
> +	clk_put(clk);
> +err_clk_get:
> +	return;
> +}
> +
> +CLOCKSOURCE_OF_DECLARE(stm32, "st,stm32-timer", stm32_clockevent_init);
>


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


WARNING: multiple messages have this Message-ID (diff)
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	u.kleine-koenig@pengutronix.de, afaerber@suse.de,
	geert@linux-m68k.org, Rob Herring <robh+dt@kernel.org>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Linus Walleij <linus.walleij@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>,
	stefan@agner.ch, pmeerw@pmeerw.net, pebolle@tiscali.nl,
	peter@hurleysoftware.com, andy.shevchenko@gmail.com,
	cw00.choi@samsung.com, Russell King <linux@arm.linux.org.uk>,
	joe@perches.com,
	Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>,
	lee.jones@linaro.org,
	Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jonathan Corbet <corbet@lwn.net>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jslaby@suse.cz>,
	Andrew Morton <akpm@linux-foundation.org>,
	"David S. Miller" <davem@davemloft.net>,
	Mauro Carvalho Chehab <mchehab@osg.samsung.com>,
	Antti Palosaari <crope@iki.fi>, Tejun Heo <tj@kernel.org>,
	Will Deacon <will.deacon@arm.com>,
	Nikolay Borisov <Nikolay.Borisov@arm.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Kees Cook <keescook@chromium.org>, Michal Marek <mmarek@suse.cz>,
	linux-doc@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-gpio@vger.kernel.org, linux-serial@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-api@vger.kernel.org,
	Nicolae Rosia <nicolae.rosia@gmail.com>,
	Kamil Lulko <rev13@wp.pl>
Subject: Re: [PATCH v8 09/16] clockevents/drivers: Add STM32 Timer driver
Date: Mon, 18 May 2015 15:10:08 +0200	[thread overview]
Message-ID: <5559E4B0.70506@linaro.org> (raw)
In-Reply-To: <1431158038-3813-10-git-send-email-mcoquelin.stm32@gmail.com>

On 05/09/2015 09:53 AM, Maxime Coquelin wrote:
> STM32 MCUs feature 16 and 32 bits general purpose timers with prescalers.
> The drivers detects whether the time is 16 or 32 bits, and applies a
> 1024 prescaler value if it is 16 bits.
>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
> Signed-off-by: Maxime Coquelin <mcoquelin.stm32@gmail.com>
> ---
>   drivers/clocksource/Kconfig       |   8 ++
>   drivers/clocksource/Makefile      |   1 +
>   drivers/clocksource/timer-stm32.c | 184 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 193 insertions(+)
>   create mode 100644 drivers/clocksource/timer-stm32.c
>
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index bf9364c..2443520 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -106,6 +106,14 @@ config CLKSRC_EFM32
>   	  Support to use the timers of EFM32 SoCs as clock source and clock
>   	  event device.
>
> +config CLKSRC_STM32
> +	bool "Clocksource for STM32 SoCs" if !ARCH_STM32
> +	depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)

Are the interactive bool and the 'COMPILE_TEST' necessary ?


> +	select CLKSRC_MMIO
> +	default ARCH_STM32
> +	help
> +	  Support to use the timers of STM32 SoCs as clock event device.
> +
>   config ARM_ARCH_TIMER
>   	bool
>   	select CLKSRC_OF if OF
> diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
> index d510c54..888a7df 100644
> --- a/drivers/clocksource/Makefile
> +++ b/drivers/clocksource/Makefile
> @@ -36,6 +36,7 @@ obj-$(CONFIG_ARCH_NSPIRE)	+= zevio-timer.o
>   obj-$(CONFIG_ARCH_BCM_MOBILE)	+= bcm_kona_timer.o
>   obj-$(CONFIG_CADENCE_TTC_TIMER)	+= cadence_ttc_timer.o
>   obj-$(CONFIG_CLKSRC_EFM32)	+= time-efm32.o
> +obj-$(CONFIG_CLKSRC_STM32)	+= timer-stm32.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
> diff --git a/drivers/clocksource/timer-stm32.c b/drivers/clocksource/timer-stm32.c
> new file mode 100644
> index 0000000..fad2e2e
> --- /dev/null
> +++ b/drivers/clocksource/timer-stm32.c
> @@ -0,0 +1,184 @@
> +/*
> + * Copyright (C) Maxime Coquelin 2015
> + * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
> + * License terms:  GNU General Public License (GPL), version 2
> + *
> + * Inspired by time-efm32.c from Uwe Kleine-Koenig
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/clocksource.h>
> +#include <linux/clockchips.h>
> +#include <linux/irq.h>
> +#include <linux/interrupt.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_irq.h>
> +#include <linux/clk.h>
> +#include <linux/reset.h>
> +
> +#define TIM_CR1		0x00
> +#define TIM_DIER	0x0c
> +#define TIM_SR		0x10
> +#define TIM_EGR		0x14
> +#define TIM_PSC		0x28
> +#define TIM_ARR		0x2c
> +
> +#define TIM_CR1_CEN	BIT(0)
> +#define TIM_CR1_OPM	BIT(3)
> +#define TIM_CR1_ARPE	BIT(7)
> +
> +#define TIM_DIER_UIE	BIT(0)
> +
> +#define TIM_SR_UIF	BIT(0)
> +
> +#define TIM_EGR_UG	BIT(0)
> +
> +struct stm32_clock_event_ddata {
> +	struct clock_event_device evtdev;
> +	unsigned periodic_top;
> +	void __iomem *base;
> +};
> +
> +static void stm32_clock_event_set_mode(enum clock_event_mode mode,
> +				       struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +	void *base = data->base;
> +
> +	switch (mode) {
> +	case CLOCK_EVT_MODE_PERIODIC:
> +		writel_relaxed(data->periodic_top, base + TIM_ARR);
> +		writel_relaxed(TIM_CR1_ARPE | TIM_CR1_CEN, base + TIM_CR1);
> +		break;
> +
> +	case CLOCK_EVT_MODE_ONESHOT:
> +	default:
> +		writel_relaxed(0, base + TIM_CR1);
> +		break;
> +	}
> +}
> +
> +static int stm32_clock_event_set_next_event(unsigned long evt,
> +					    struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +
> +	writel_relaxed(evt, data->base + TIM_ARR);
> +	writel_relaxed(TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_CEN,
> +		       data->base + TIM_CR1);
> +
> +	return 0;
> +}
> +
> +static irqreturn_t stm32_clock_event_handler(int irq, void *dev_id)
> +{
> +	struct stm32_clock_event_ddata *data = dev_id;
> +
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->evtdev.event_handler(&data->evtdev);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static struct stm32_clock_event_ddata clock_event_ddata = {
> +	.evtdev = {
> +		.name = "stm32 clockevent",
> +		.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
> +		.set_mode = stm32_clock_event_set_mode,
> +		.set_next_event = stm32_clock_event_set_next_event,
> +		.rating = 200,
> +	},
> +};
> +
> +static void __init stm32_clockevent_init(struct device_node *np)
> +{
> +	struct stm32_clock_event_ddata *data = &clock_event_ddata;
> +	struct clk *clk;
> +	struct reset_control *rstc;
> +	unsigned long rate, max_delta;
> +	int irq, ret, bits, prescaler = 1;
> +
> +	clk = of_clk_get(np, 0);
> +	if (IS_ERR(clk)) {
> +		ret = PTR_ERR(clk);
> +		pr_err("failed to get clock for clockevent (%d)\n", ret);
> +		goto err_clk_get;
> +	}
> +
> +	ret = clk_prepare_enable(clk);
> +	if (ret) {
> +		pr_err("failed to enable timer clock for clockevent (%d)\n",
> +		       ret);
> +		goto err_clk_enable;
> +	}
> +
> +	rate = clk_get_rate(clk);
> +
> +	rstc = of_reset_control_get(np, NULL);
> +	if (!IS_ERR(rstc)) {
> +		reset_control_assert(rstc);
> +		reset_control_deassert(rstc);
> +	}
> +
> +	data->base = of_iomap(np, 0);
> +	if (!data->base) {
> +		pr_err("failed to map registers for clockevent\n");
> +		goto err_iomap;
> +	}
> +
> +	irq = irq_of_parse_and_map(np, 0);
> +	if (!irq) {
> +		pr_err("%s: failed to get irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	/* Detect whether the timer is 16 or 32 bits */
> +	writel_relaxed(~0UL, data->base + TIM_ARR);
> +	max_delta = readl_relaxed(data->base + TIM_ARR);
> +	if (max_delta == ~0UL) {
> +		prescaler = 1;
> +		bits = 32;
> +	} else {
> +		prescaler = 1024;
> +		bits = 16;
> +	}
> +	writel_relaxed(0, data->base + TIM_ARR);
> +
> +	writel_relaxed(prescaler - 1, data->base + TIM_PSC);
> +	writel_relaxed(TIM_EGR_UG, data->base + TIM_EGR);
> +	writel_relaxed(TIM_DIER_UIE, data->base + TIM_DIER);
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->periodic_top = DIV_ROUND_CLOSEST(rate, prescaler * HZ);
> +
> +	clockevents_config_and_register(&data->evtdev,
> +					DIV_ROUND_CLOSEST(rate, prescaler),
> +					0x1, max_delta);
> +
> +	ret = request_irq(irq, stm32_clock_event_handler, IRQF_TIMER,
> +			"stm32 clockevent", data);
> +	if (ret) {
> +		pr_err("%s: failed to request irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	pr_info("%s: STM32 clockevent driver initialized (%d bits)\n",
> +			np->full_name, bits);
> +
> +	return;
> +
> +err_get_irq:
> +	iounmap(data->base);
> +err_iomap:
> +	clk_disable_unprepare(clk);
> +err_clk_enable:
> +	clk_put(clk);
> +err_clk_get:
> +	return;
> +}
> +
> +CLOCKSOURCE_OF_DECLARE(stm32, "st,stm32-timer", stm32_clockevent_init);
>


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


WARNING: multiple messages have this Message-ID (diff)
From: daniel.lezcano@linaro.org (Daniel Lezcano)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v8 09/16] clockevents/drivers: Add STM32 Timer driver
Date: Mon, 18 May 2015 15:10:08 +0200	[thread overview]
Message-ID: <5559E4B0.70506@linaro.org> (raw)
In-Reply-To: <1431158038-3813-10-git-send-email-mcoquelin.stm32@gmail.com>

On 05/09/2015 09:53 AM, Maxime Coquelin wrote:
> STM32 MCUs feature 16 and 32 bits general purpose timers with prescalers.
> The drivers detects whether the time is 16 or 32 bits, and applies a
> 1024 prescaler value if it is 16 bits.
>
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
> Signed-off-by: Maxime Coquelin <mcoquelin.stm32@gmail.com>
> ---
>   drivers/clocksource/Kconfig       |   8 ++
>   drivers/clocksource/Makefile      |   1 +
>   drivers/clocksource/timer-stm32.c | 184 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 193 insertions(+)
>   create mode 100644 drivers/clocksource/timer-stm32.c
>
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index bf9364c..2443520 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -106,6 +106,14 @@ config CLKSRC_EFM32
>   	  Support to use the timers of EFM32 SoCs as clock source and clock
>   	  event device.
>
> +config CLKSRC_STM32
> +	bool "Clocksource for STM32 SoCs" if !ARCH_STM32
> +	depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)

Are the interactive bool and the 'COMPILE_TEST' necessary ?


> +	select CLKSRC_MMIO
> +	default ARCH_STM32
> +	help
> +	  Support to use the timers of STM32 SoCs as clock event device.
> +
>   config ARM_ARCH_TIMER
>   	bool
>   	select CLKSRC_OF if OF
> diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
> index d510c54..888a7df 100644
> --- a/drivers/clocksource/Makefile
> +++ b/drivers/clocksource/Makefile
> @@ -36,6 +36,7 @@ obj-$(CONFIG_ARCH_NSPIRE)	+= zevio-timer.o
>   obj-$(CONFIG_ARCH_BCM_MOBILE)	+= bcm_kona_timer.o
>   obj-$(CONFIG_CADENCE_TTC_TIMER)	+= cadence_ttc_timer.o
>   obj-$(CONFIG_CLKSRC_EFM32)	+= time-efm32.o
> +obj-$(CONFIG_CLKSRC_STM32)	+= timer-stm32.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
> diff --git a/drivers/clocksource/timer-stm32.c b/drivers/clocksource/timer-stm32.c
> new file mode 100644
> index 0000000..fad2e2e
> --- /dev/null
> +++ b/drivers/clocksource/timer-stm32.c
> @@ -0,0 +1,184 @@
> +/*
> + * Copyright (C) Maxime Coquelin 2015
> + * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
> + * License terms:  GNU General Public License (GPL), version 2
> + *
> + * Inspired by time-efm32.c from Uwe Kleine-Koenig
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/clocksource.h>
> +#include <linux/clockchips.h>
> +#include <linux/irq.h>
> +#include <linux/interrupt.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_irq.h>
> +#include <linux/clk.h>
> +#include <linux/reset.h>
> +
> +#define TIM_CR1		0x00
> +#define TIM_DIER	0x0c
> +#define TIM_SR		0x10
> +#define TIM_EGR		0x14
> +#define TIM_PSC		0x28
> +#define TIM_ARR		0x2c
> +
> +#define TIM_CR1_CEN	BIT(0)
> +#define TIM_CR1_OPM	BIT(3)
> +#define TIM_CR1_ARPE	BIT(7)
> +
> +#define TIM_DIER_UIE	BIT(0)
> +
> +#define TIM_SR_UIF	BIT(0)
> +
> +#define TIM_EGR_UG	BIT(0)
> +
> +struct stm32_clock_event_ddata {
> +	struct clock_event_device evtdev;
> +	unsigned periodic_top;
> +	void __iomem *base;
> +};
> +
> +static void stm32_clock_event_set_mode(enum clock_event_mode mode,
> +				       struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +	void *base = data->base;
> +
> +	switch (mode) {
> +	case CLOCK_EVT_MODE_PERIODIC:
> +		writel_relaxed(data->periodic_top, base + TIM_ARR);
> +		writel_relaxed(TIM_CR1_ARPE | TIM_CR1_CEN, base + TIM_CR1);
> +		break;
> +
> +	case CLOCK_EVT_MODE_ONESHOT:
> +	default:
> +		writel_relaxed(0, base + TIM_CR1);
> +		break;
> +	}
> +}
> +
> +static int stm32_clock_event_set_next_event(unsigned long evt,
> +					    struct clock_event_device *evtdev)
> +{
> +	struct stm32_clock_event_ddata *data =
> +		container_of(evtdev, struct stm32_clock_event_ddata, evtdev);
> +
> +	writel_relaxed(evt, data->base + TIM_ARR);
> +	writel_relaxed(TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_CEN,
> +		       data->base + TIM_CR1);
> +
> +	return 0;
> +}
> +
> +static irqreturn_t stm32_clock_event_handler(int irq, void *dev_id)
> +{
> +	struct stm32_clock_event_ddata *data = dev_id;
> +
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->evtdev.event_handler(&data->evtdev);
> +
> +	return IRQ_HANDLED;
> +}
> +
> +static struct stm32_clock_event_ddata clock_event_ddata = {
> +	.evtdev = {
> +		.name = "stm32 clockevent",
> +		.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
> +		.set_mode = stm32_clock_event_set_mode,
> +		.set_next_event = stm32_clock_event_set_next_event,
> +		.rating = 200,
> +	},
> +};
> +
> +static void __init stm32_clockevent_init(struct device_node *np)
> +{
> +	struct stm32_clock_event_ddata *data = &clock_event_ddata;
> +	struct clk *clk;
> +	struct reset_control *rstc;
> +	unsigned long rate, max_delta;
> +	int irq, ret, bits, prescaler = 1;
> +
> +	clk = of_clk_get(np, 0);
> +	if (IS_ERR(clk)) {
> +		ret = PTR_ERR(clk);
> +		pr_err("failed to get clock for clockevent (%d)\n", ret);
> +		goto err_clk_get;
> +	}
> +
> +	ret = clk_prepare_enable(clk);
> +	if (ret) {
> +		pr_err("failed to enable timer clock for clockevent (%d)\n",
> +		       ret);
> +		goto err_clk_enable;
> +	}
> +
> +	rate = clk_get_rate(clk);
> +
> +	rstc = of_reset_control_get(np, NULL);
> +	if (!IS_ERR(rstc)) {
> +		reset_control_assert(rstc);
> +		reset_control_deassert(rstc);
> +	}
> +
> +	data->base = of_iomap(np, 0);
> +	if (!data->base) {
> +		pr_err("failed to map registers for clockevent\n");
> +		goto err_iomap;
> +	}
> +
> +	irq = irq_of_parse_and_map(np, 0);
> +	if (!irq) {
> +		pr_err("%s: failed to get irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	/* Detect whether the timer is 16 or 32 bits */
> +	writel_relaxed(~0UL, data->base + TIM_ARR);
> +	max_delta = readl_relaxed(data->base + TIM_ARR);
> +	if (max_delta == ~0UL) {
> +		prescaler = 1;
> +		bits = 32;
> +	} else {
> +		prescaler = 1024;
> +		bits = 16;
> +	}
> +	writel_relaxed(0, data->base + TIM_ARR);
> +
> +	writel_relaxed(prescaler - 1, data->base + TIM_PSC);
> +	writel_relaxed(TIM_EGR_UG, data->base + TIM_EGR);
> +	writel_relaxed(TIM_DIER_UIE, data->base + TIM_DIER);
> +	writel_relaxed(0, data->base + TIM_SR);
> +
> +	data->periodic_top = DIV_ROUND_CLOSEST(rate, prescaler * HZ);
> +
> +	clockevents_config_and_register(&data->evtdev,
> +					DIV_ROUND_CLOSEST(rate, prescaler),
> +					0x1, max_delta);
> +
> +	ret = request_irq(irq, stm32_clock_event_handler, IRQF_TIMER,
> +			"stm32 clockevent", data);
> +	if (ret) {
> +		pr_err("%s: failed to request irq.\n", np->full_name);
> +		goto err_get_irq;
> +	}
> +
> +	pr_info("%s: STM32 clockevent driver initialized (%d bits)\n",
> +			np->full_name, bits);
> +
> +	return;
> +
> +err_get_irq:
> +	iounmap(data->base);
> +err_iomap:
> +	clk_disable_unprepare(clk);
> +err_clk_enable:
> +	clk_put(clk);
> +err_clk_get:
> +	return;
> +}
> +
> +CLOCKSOURCE_OF_DECLARE(stm32, "st,stm32-timer", stm32_clockevent_init);
>


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

  parent reply	other threads:[~2015-05-18 13:10 UTC|newest]

Thread overview: 258+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-09  7:53 [PATCH v8 00/16] Add support to STMicroelectronics STM32 family Maxime Coquelin
2015-05-09  7:53 ` Maxime Coquelin
2015-05-09  7:53 ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 01/16] scripts: link-vmlinux: Don't pass page offset to kallsyms if XIP Kernel Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-18 11:47   ` Maxime Coquelin
2015-05-18 11:47     ` Maxime Coquelin
2015-05-18 11:47     ` Maxime Coquelin
2015-05-20 23:04     ` Andreas Färber
2015-05-20 23:04       ` Andreas Färber
2015-05-20 23:04       ` Andreas Färber
     [not found]       ` <555D12F8.4000403-l3A5Bk7waGM@public.gmane.org>
2015-05-21  5:40         ` Michal Marek
2015-05-21  5:40           ` Michal Marek
2015-05-21  5:40           ` Michal Marek
2015-05-21  7:42           ` Maxime Coquelin
2015-05-21  7:42             ` Maxime Coquelin
2015-05-21  7:42             ` Maxime Coquelin
2015-05-22 20:20         ` Andreas Färber
2015-05-22 20:20           ` Andreas Färber
2015-05-22 20:20           ` Andreas Färber
2015-05-09  7:53 ` [PATCH v8 02/16] ARM: ARMv7-M: Enlarge vector table up to 256 entries Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 03/16] dt-bindings: Document the ARM System timer bindings Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 04/16] clocksource/drivers: Add ARM System timer driver Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-18 11:55   ` Maxime Coquelin
2015-05-18 11:55     ` Maxime Coquelin
2015-05-18 11:55     ` Maxime Coquelin
2015-05-18 11:55     ` Maxime Coquelin
     [not found]     ` <CALszF6BiKwDKejfpVgs6ojTxC4LSRfLSEaszXTGVy7xfbHLHZg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-18 12:49       ` Daniel Lezcano
2015-05-18 12:49         ` Daniel Lezcano
2015-05-18 12:49         ` Daniel Lezcano
2015-05-18 12:49         ` Daniel Lezcano
2015-05-18 12:57         ` Maxime Coquelin
2015-05-18 12:57           ` Maxime Coquelin
2015-05-18 12:57           ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 05/16] dt-bindings: mfd: Add STM32F4 RCC numeric constants into DT include file Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 07/16] drivers: reset: Add STM32 reset driver Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
     [not found]   ` <1431158038-3813-8-git-send-email-mcoquelin.stm32-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-05-20 23:45     ` Andreas Färber
2015-05-20 23:45       ` Andreas Färber
2015-05-20 23:45       ` Andreas Färber
2015-05-21  7:46       ` Maxime Coquelin
2015-05-21  7:46         ` Maxime Coquelin
2015-05-21  7:46         ` Maxime Coquelin
2015-05-21 17:58         ` Andreas Färber
2015-05-21 17:58           ` Andreas Färber
2015-05-21 17:58           ` Andreas Färber
2015-05-21 19:57           ` Maxime Coquelin
2015-05-21 19:57             ` Maxime Coquelin
2015-05-21 19:57             ` Maxime Coquelin
2015-05-21 22:01             ` Andreas Färber
2015-05-21 22:01               ` Andreas Färber
2015-05-21 22:01               ` Andreas Färber
2015-05-22 14:04               ` Maxime Coquelin
2015-05-22 14:04                 ` Maxime Coquelin
2015-05-22 14:04                 ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 08/16] dt-bindings: Document the STM32 timer bindings Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 09/16] clockevents/drivers: Add STM32 Timer driver Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-18 12:59   ` Maxime Coquelin
2015-05-18 12:59     ` Maxime Coquelin
2015-05-18 13:10   ` Daniel Lezcano [this message]
2015-05-18 13:10     ` Daniel Lezcano
2015-05-18 13:10     ` Daniel Lezcano
2015-05-18 14:03     ` Maxime Coquelin
2015-05-18 14:03       ` Maxime Coquelin
2015-05-18 14:03       ` Maxime Coquelin
2015-05-19  8:16       ` Daniel Lezcano
2015-05-19  8:16         ` Daniel Lezcano
2015-05-19  8:16         ` Daniel Lezcano
2015-05-19  8:55         ` Maxime Coquelin
2015-05-19  8:55           ` Maxime Coquelin
2015-05-19  8:55           ` Maxime Coquelin
     [not found]           ` <CALszF6CwGuKqgbX6gVrya1-_YOgvtrgC7pVqKTNjCRif_o532A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-19  9:06             ` Daniel Lezcano
2015-05-19  9:06               ` Daniel Lezcano
2015-05-19  9:06               ` Daniel Lezcano
2015-05-19  9:44               ` Maxime Coquelin
2015-05-19  9:44                 ` Maxime Coquelin
2015-05-19  9:44                 ` Maxime Coquelin
2015-05-19  9:59                 ` Daniel Lezcano
2015-05-19  9:59                   ` Daniel Lezcano
2015-05-19  9:59                   ` Daniel Lezcano
     [not found]                   ` <555B098A.8030202-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-05-19 10:02                     ` Maxime Coquelin
2015-05-19 10:02                       ` Maxime Coquelin
2015-05-19 10:02                       ` Maxime Coquelin
     [not found]                       ` <CALszF6AJ3Zf598wYeUx=iNWHHKT24xUyfagB=+4GocwZ-Fd-0g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-19 10:55                         ` Arnd Bergmann
2015-05-19 10:55                           ` Arnd Bergmann
2015-05-19 10:55                           ` Arnd Bergmann
2015-05-19 13:42                           ` Maxime Coquelin
2015-05-19 13:42                             ` Maxime Coquelin
2015-05-19 13:42                             ` Maxime Coquelin
2015-05-19 13:49                             ` Daniel Lezcano
2015-05-19 13:49                               ` Daniel Lezcano
2015-05-19 13:49                               ` Daniel Lezcano
2015-05-19 14:05                               ` Arnd Bergmann
2015-05-19 14:05                                 ` Arnd Bergmann
2015-05-19 14:05                                 ` Arnd Bergmann
2015-05-19 14:41                               ` Maxime Coquelin
2015-05-19 14:41                                 ` Maxime Coquelin
2015-05-19 14:41                                 ` Maxime Coquelin
2015-05-19 14:50                                 ` Russell King - ARM Linux
2015-05-19 14:50                                   ` Russell King - ARM Linux
2015-05-19 14:50                                   ` Russell King - ARM Linux
2015-05-19 15:34                                   ` Maxime Coquelin
2015-05-19 15:34                                     ` Maxime Coquelin
2015-05-19 15:34                                     ` Maxime Coquelin
     [not found]                                 ` <CALszF6A-De6dvcRNoa9ruL+y6Wt_rc7bi-O-VxHWkFF9NSt5_g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-19 15:03                                   ` Daniel Lezcano
2015-05-19 15:03                                     ` Daniel Lezcano
2015-05-19 15:03                                     ` Daniel Lezcano
2015-05-19 12:56                       ` Thomas Gleixner
2015-05-19 12:56                         ` Thomas Gleixner
2015-05-19 12:56                         ` Thomas Gleixner
2015-05-19 13:00                         ` Russell King - ARM Linux
2015-05-19 13:00                           ` Russell King - ARM Linux
2015-05-19 13:00                           ` Russell King - ARM Linux
     [not found]                           ` <20150519130028.GF2067-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2015-05-19 13:17                             ` Maxime Coquelin
2015-05-19 13:17                               ` Maxime Coquelin
2015-05-19 13:17                               ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 10/16] dt-bindings: Document the STM32 USART bindings Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 11/16] serial: stm32-usart: Add STM32 USART Driver Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09 10:07   ` Andy Shevchenko
2015-05-09 10:07     ` Andy Shevchenko
2015-05-09 10:07     ` Andy Shevchenko
2015-05-18 13:05   ` Maxime Coquelin
2015-05-18 13:05     ` Maxime Coquelin
2015-05-09  7:53 ` [PATCH v8 12/16] ARM: Add STM32 family machine Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
     [not found]   ` <1431158038-3813-13-git-send-email-mcoquelin.stm32-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-05-15 19:57     ` Arnd Bergmann
2015-05-15 19:57       ` Arnd Bergmann
2015-05-15 19:57       ` Arnd Bergmann
2015-05-09  7:53 ` [PATCH v8 13/16] ARM: dts: Add ARM System timer as clocksource in armv7m Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-15 19:59   ` Arnd Bergmann
2015-05-15 19:59     ` Arnd Bergmann
2015-05-15 19:59     ` Arnd Bergmann
2015-05-09  7:53 ` [PATCH v8 14/16] ARM: dts: Introduce STM32F429 MCU Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-12 21:21   ` Arnd Bergmann
2015-05-12 21:21     ` Arnd Bergmann
2015-05-12 21:21     ` Arnd Bergmann
2015-05-13 11:45     ` Maxime Coquelin
2015-05-13 11:45       ` Maxime Coquelin
2015-05-13 11:45       ` Maxime Coquelin
     [not found]       ` <CALszF6CS8Q9DWX+ERtu=k=Bzr1-25N3oZQyWyxDZBF3an4nFKQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 12:58         ` Daniel Thompson
2015-05-13 12:58           ` Daniel Thompson
2015-05-13 12:58           ` Daniel Thompson
2015-05-13 13:27           ` Arnd Bergmann
2015-05-13 13:27             ` Arnd Bergmann
2015-05-13 13:27             ` Arnd Bergmann
2015-05-13 15:20             ` Daniel Thompson
2015-05-13 15:20               ` Daniel Thompson
2015-05-13 15:28               ` Arnd Bergmann
2015-05-13 15:28                 ` Arnd Bergmann
2015-05-13 15:28                 ` Arnd Bergmann
2015-05-13 16:29                 ` Maxime Coquelin
2015-05-13 16:29                   ` Maxime Coquelin
2015-05-13 16:29                   ` Maxime Coquelin
     [not found]                   ` <CALszF6DHazhN6+hGShyrmqtMrPod0hdb8mHAwK-GWfRxXzy7wQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 16:37                     ` Arnd Bergmann
2015-05-13 16:37                       ` Arnd Bergmann
2015-05-13 16:37                       ` Arnd Bergmann
2015-05-13 16:54                       ` Maxime Coquelin
2015-05-13 16:54                         ` Maxime Coquelin
2015-05-13 16:54                         ` Maxime Coquelin
     [not found]                         ` <CALszF6CaO_yuNiSDuDV+4d2NRe_+32j=zcSE1HPhB1UH59cW9w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 19:11                           ` Arnd Bergmann
2015-05-13 19:11                             ` Arnd Bergmann
2015-05-13 19:11                             ` Arnd Bergmann
2015-05-13 19:11                             ` Arnd Bergmann
2015-05-13 19:11                             ` Arnd Bergmann
2015-05-20 16:17                             ` Maxime Coquelin
2015-05-20 16:17                               ` Maxime Coquelin
2015-05-20 16:17                               ` Maxime Coquelin
2015-05-21 18:51                               ` Maxime Ripard
2015-05-21 18:51                                 ` Maxime Ripard
2015-05-21 20:10                                 ` Maxime Coquelin
2015-05-21 20:10                                   ` Maxime Coquelin
2015-05-21 20:10                                   ` Maxime Coquelin
2015-05-23  8:28                                   ` Maxime Ripard
2015-05-23  8:28                                     ` Maxime Ripard
2015-05-23  8:28                                     ` Maxime Ripard
2015-05-26  9:25                                     ` Maxime Coquelin
2015-05-26  9:25                                       ` Maxime Coquelin
2015-05-26  9:25                                       ` Maxime Coquelin
2015-05-22  9:06                               ` Philipp Zabel
2015-05-22  9:06                                 ` Philipp Zabel
2015-05-22  9:18                                 ` Maxime Ripard
2015-05-22  9:18                                   ` Maxime Ripard
2015-05-22 10:07                                   ` Philipp Zabel
2015-05-22 10:07                                     ` Philipp Zabel
2015-05-22 12:32                                     ` Maxime Coquelin
2015-05-22 12:32                                       ` Maxime Coquelin
2015-05-22 12:43                                       ` Daniel Thompson
2015-05-22 12:43                                         ` Daniel Thompson
2015-05-22 12:43                                         ` Daniel Thompson
2015-05-22 13:09                                       ` Andreas Färber
2015-05-22 13:09                                         ` Andreas Färber
2015-05-22 13:57                                         ` Maxime Coquelin
2015-05-22 13:57                                           ` Maxime Coquelin
2015-05-22 13:57                                           ` Maxime Coquelin
2015-05-22 14:06                                           ` Andreas Färber
2015-05-22 14:06                                             ` Andreas Färber
2015-05-22 14:06                                             ` Andreas Färber
2015-05-22 14:14                                           ` Daniel Thompson
2015-05-22 14:14                                             ` Daniel Thompson
2015-05-22 14:14                                             ` Daniel Thompson
2015-05-23  8:18                                     ` Maxime Ripard
2015-05-23  8:18                                       ` Maxime Ripard
2015-05-22  9:41                                 ` Maxime Coquelin
2015-05-22  9:41                                   ` Maxime Coquelin
2015-05-13 19:29                         ` Daniel Thompson
2015-05-13 19:29                           ` Daniel Thompson
2015-05-13 19:29                           ` Daniel Thompson
     [not found]                           ` <5553A608.9080402-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-05-13 19:37                             ` Arnd Bergmann
2015-05-13 19:37                               ` Arnd Bergmann
2015-05-13 19:37                               ` Arnd Bergmann
2015-05-14 16:34                               ` Maxime Coquelin
2015-05-14 16:34                                 ` Maxime Coquelin
2015-05-14 16:34                                 ` Maxime Coquelin
2015-05-14 19:38                                 ` Daniel Thompson
2015-05-14 19:38                                   ` Daniel Thompson
2015-05-14 19:38                                   ` Daniel Thompson
2015-05-18 12:21                         ` Maxime Coquelin
2015-05-18 12:21                           ` Maxime Coquelin
2015-05-18 12:21                           ` Maxime Coquelin
     [not found] ` <1431158038-3813-1-git-send-email-mcoquelin.stm32-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-05-09  7:53   ` [PATCH v8 06/16] dt-bindings: Document the STM32 reset bindings Maxime Coquelin
2015-05-09  7:53     ` Maxime Coquelin
2015-05-09  7:53     ` Maxime Coquelin
2015-05-09  7:53   ` [PATCH v8 15/16] ARM: configs: Add STM32 defconfig Maxime Coquelin
2015-05-09  7:53     ` Maxime Coquelin
2015-05-09  7:53     ` Maxime Coquelin
     [not found]     ` <1431158038-3813-16-git-send-email-mcoquelin.stm32-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-05-15 20:03       ` Arnd Bergmann
2015-05-15 20:03         ` Arnd Bergmann
2015-05-15 20:03         ` Arnd Bergmann
2015-05-09  7:53 ` [PATCH v8 16/16] MAINTAINERS: Add entry for STM32 MCUs Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-09  7:53   ` Maxime Coquelin
2015-05-15 19:58   ` Arnd Bergmann
2015-05-15 19:58     ` Arnd Bergmann
2015-05-15 19:58     ` Arnd Bergmann

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=5559E4B0.70506@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=Nikolay.Borisov@arm.com \
    --cc=afaerber@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=arnd@arndb.de \
    --cc=corbet@lwn.net \
    --cc=crope@iki.fi \
    --cc=cw00.choi@samsung.com \
    --cc=daniel.thompson@linaro.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=joe@perches.com \
    --cc=jslaby@suse.cz \
    --cc=keescook@chromium.org \
    --cc=lee.jones@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arch@vger.kerne \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=mchehab@osg.samsung.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=mmarek@suse.cz \
    --cc=p.zabel@pengutronix.de \
    --cc=pawel.moll@arm.com \
    --cc=pebolle@tiscali.nl \
    --cc=peter@hurleysoftware.com \
    --cc=pmeerw@pmeerw.net \
    --cc=robh+dt@kernel.org \
    --cc=rusty@rustcorp.com.au \
    --cc=stefan@agner.ch \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=u.kleine-koenig@pengutronix.de \
    --cc=vladimir_zapolskiy@mentor.com \
    --cc=will.deacon@arm.com \
    /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.