* [PATCH v4 0/3] Introduce clocksource driver for Keystone platform @ 2014-02-04 11:30 Ivan Khoronzhuk 2014-02-04 11:30 ` [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone Ivan Khoronzhuk ` (2 more replies) 0 siblings, 3 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:30 UTC (permalink / raw) To: santosh.shilimkar, rob, linux, galak Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, tglx, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko, Ivan Khoronzhuk Add a broadcast timer64 based clockevent driver for keystone arch. This driver uses timer in 64-bit general purpose mode as clock event device. Documentation: http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf Based on git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone.git keystone/master v3..v4: rebased on latest of linux-keystone.git keystone/master v2..v3: - clocksource: timer-keystone: introduce clocksource driver for changed "u64" type to "unsigned long" for hz_period as more appropriate hz_period rounded up by DIV_ROUND_UP(rate, HZ) corrected comments v1..v2: - clocksource: timer-keystone: introduce clocksource driver for renamed timer on "timer-keystone" in keystone_timer_interrupt() evet pointer is passed via "dev_id" used __relaxed variants of writel/readl and added explicit barriers added "keystone_timer_disable()" for using in keystone_set_mode() keystone_timer_config() is not used for disabling the timer any more in case of an unsupported mode the keystone_timer_config() returns -1. used request_irq() instead of setup_irq() assigned irq for event_device in event_dev->irq calculated timer.hz_period for CLOCK_EVT_MODE_PERIODIC at init deleted spare call of keystone_timer_config() in keystone_timer_init() * Ivan Khoronzhuk (3): clocksource: timer-keystone: introduce clocksource driver for Keystone clocksource: keystone: add bindings for keystone timer arm: dts: keystone: add keystone timer entry .../bindings/timer/ti,keystone-timer.txt | 29 +++ arch/arm/boot/dts/keystone-clocks.dtsi | 10 + arch/arm/boot/dts/keystone.dtsi | 7 + drivers/clocksource/Makefile | 1 + drivers/clocksource/timer-keystone.c | 233 +++++++++++++++++++++ 5 files changed, 280 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/ti,keystone-timer.txt create mode 100644 drivers/clocksource/timer-keystone.c -- 1.8.3.2 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 11:30 [PATCH v4 0/3] Introduce clocksource driver for Keystone platform Ivan Khoronzhuk @ 2014-02-04 11:30 ` Ivan Khoronzhuk 2014-02-04 11:41 ` Ivan Khoronzhuk 2014-02-04 16:24 ` Thomas Gleixner [not found] ` <1391513453-21140-1-git-send-email-ivan.khoronzhuk-l0cyMroinI0@public.gmane.org> 2014-02-04 11:30 ` [PATCH v4 3/3] arm: dts: keystone: add keystone timer entry Ivan Khoronzhuk 2 siblings, 2 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:30 UTC (permalink / raw) To: santosh.shilimkar, rob, linux, galak Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, tglx, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko, Ivan Khoronzhuk Add broadcast clock-event device for the Keystone arch. The timer can be configured as a general-purpose 64-bit timer, dual general-purpose 32-bit timers. When configured as dual 32-bit timers, each half can operate in conjunction (chain mode) or independently (unchained mode) of each other. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> --- drivers/clocksource/Makefile | 1 + drivers/clocksource/timer-keystone.c | 233 +++++++++++++++++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 drivers/clocksource/timer-keystone.c diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index c7ca50a..4abe5aa 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -37,3 +37,4 @@ obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o obj-$(CONFIG_ARM_GLOBAL_TIMER) += arm_global_timer.o obj-$(CONFIG_CLKSRC_METAG_GENERIC) += metag_generic.o obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o +obj-$(CONFIG_ARCH_KEYSTONE) += timer-keystone.o diff --git a/drivers/clocksource/timer-keystone.c b/drivers/clocksource/timer-keystone.c new file mode 100644 index 0000000..cbac8d0 --- /dev/null +++ b/drivers/clocksource/timer-keystone.c @@ -0,0 +1,233 @@ +/* + * Keystone broadcast clock-event + * + * Copyright 2013 Texas Instruments, Inc. + * + * Author: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include <linux/clk.h> +#include <linux/clockchips.h> +#include <linux/clocksource.h> +#include <linux/interrupt.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> + +#define TIMER_NAME "timer-keystone" + +/* Timer register offsets */ +#define TIM12 0x10 +#define TIM34 0x14 +#define PRD12 0x18 +#define PRD34 0x1c +#define TCR 0x20 +#define TGCR 0x24 +#define INTCTLSTAT 0x44 + +/* Timer register bitfields */ +#define TCR_ENAMODE_MASK 0xC0 +#define TCR_ENAMODE_ONESHOT_MASK 0x40 +#define TCR_ENAMODE_PERIODIC_MASK 0x80 + +#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 inline u32 keystone_timer_readl(unsigned long rg) +{ + return readl_relaxed(timer.base + rg); +} + +static inline void keystone_timer_writel(u32 val, unsigned long rg) +{ + writel_relaxed(val, timer.base + rg); +} + +/** + * keystone_timer_config: configures timer to work in oneshot/periodic modes. + * @ mode: mode to configure + * @ period: cycles number to configure for + */ +static int keystone_timer_config(u64 period, enum clock_event_mode mode) +{ + u32 tcr; + u32 off; + + tcr = keystone_timer_readl(TCR); + off = tcr & ~(TCR_ENAMODE_MASK); + + /* set enable mode */ + switch (mode) { + case CLOCK_EVT_MODE_ONESHOT: + tcr |= TCR_ENAMODE_ONESHOT_MASK; + break; + case CLOCK_EVT_MODE_PERIODIC: + tcr |= TCR_ENAMODE_PERIODIC_MASK; + break; + default: + return -1; + } + + /* disable timer */ + keystone_timer_writel(off, TCR); + /* here we have to be sure the timer has been disabled */ + wmb(); + + /* reset counter to zero, set new period */ + keystone_timer_writel(0, TIM12); + keystone_timer_writel(0, TIM34); + keystone_timer_writel(period & 0xffffffff, PRD12); + keystone_timer_writel(period >> 32, PRD34); + + /* + * enable timer + * here we have to be sure that CNTLO, CNTHI, PRDLO, PRDHI registers + * have been written. + */ + wmb(); + keystone_timer_writel(tcr, TCR); + return 0; +} + +static void keystone_timer_disable(void) +{ + u32 tcr; + + tcr = keystone_timer_readl(TCR); + + /* disable timer */ + tcr &= ~(TCR_ENAMODE_MASK); + keystone_timer_writel(tcr, TCR); +} + +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; +} + +static int keystone_set_next_event(unsigned long cycles, + struct clock_event_device *evt) +{ + return keystone_timer_config(cycles, evt->mode); +} + +static void keystone_set_mode(enum clock_event_mode mode, + struct clock_event_device *evt) +{ + switch (mode) { + case CLOCK_EVT_MODE_PERIODIC: + keystone_timer_config(timer.hz_period, CLOCK_EVT_MODE_PERIODIC); + break; + case CLOCK_EVT_MODE_UNUSED: + case CLOCK_EVT_MODE_SHUTDOWN: + case CLOCK_EVT_MODE_ONESHOT: + keystone_timer_disable(); + break; + default: + break; + } +} + +static void __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; + u32 tgcr; + + irq = irq_of_parse_and_map(np, 0); + if (irq == NO_IRQ) { + pr_err("%s: failed to map interrupts\n", __func__); + return; + } + + timer.base = of_iomap(np, 0); + if (!timer.base) { + pr_err("%s: failed to map registers\n", __func__); + return; + } + + clk = of_clk_get(np, 0); + if (!clk) { + pr_err("%s: failed to get clock\n", __func__); + iounmap(timer.base); + return; + } + + error = clk_prepare_enable(clk); + if (error) { + pr_err("%s: failed to enable clock\n", __func__); + goto err; + } + + rate = clk_get_rate(clk); + + /* disable, use internal clock source */ + keystone_timer_writel(0, TCR); + /* here we have to be sure the timer has been disabled */ + wmb(); + + /* reset timer as 64-bit, no pre-scaler, plus features are disabled */ + tgcr = 0; + keystone_timer_writel(0, TGCR); + + /* unreset timer */ + tgcr |= TGCR_TIM_UNRESET_MASK; + keystone_timer_writel(tgcr, TGCR); + + /* init counter to zero */ + 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_mode = keystone_set_mode; + 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); + return; +err: + clk_put(clk); + iounmap(timer.base); +} + +CLOCKSOURCE_OF_DECLARE(keystone_timer, "ti,keystone-timer", + keystone_timer_init); -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 11:30 ` [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone Ivan Khoronzhuk @ 2014-02-04 11:41 ` Ivan Khoronzhuk 2014-02-04 16:24 ` Thomas Gleixner 1 sibling, 0 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:41 UTC (permalink / raw) To: santosh.shilimkar, rob, linux, galak Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, tglx, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko, Ivan Khoronzhuk Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Acked-by: Santosh shilimkar <santosh.shilimkar@ti.com> On 02/04/2014 01:30 PM, Ivan Khoronzhuk wrote: > Add broadcast clock-event device for the Keystone arch. > > The timer can be configured as a general-purpose 64-bit timer, > dual general-purpose 32-bit timers. When configured as dual 32-bit > timers, each half can operate in conjunction (chain mode) or > independently (unchained mode) of each other. > > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> > --- > drivers/clocksource/Makefile | 1 + > drivers/clocksource/timer-keystone.c | 233 +++++++++++++++++++++++++++++++++++ > 2 files changed, 234 insertions(+) > create mode 100644 drivers/clocksource/timer-keystone.c > > diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile > index c7ca50a..4abe5aa 100644 > --- a/drivers/clocksource/Makefile > +++ b/drivers/clocksource/Makefile > @@ -37,3 +37,4 @@ obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o > obj-$(CONFIG_ARM_GLOBAL_TIMER) += arm_global_timer.o > obj-$(CONFIG_CLKSRC_METAG_GENERIC) += metag_generic.o > obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o > +obj-$(CONFIG_ARCH_KEYSTONE) += timer-keystone.o > diff --git a/drivers/clocksource/timer-keystone.c b/drivers/clocksource/timer-keystone.c > new file mode 100644 > index 0000000..cbac8d0 > --- /dev/null > +++ b/drivers/clocksource/timer-keystone.c > @@ -0,0 +1,233 @@ > +/* > + * Keystone broadcast clock-event > + * > + * Copyright 2013 Texas Instruments, Inc. > + * > + * Author: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + */ > + > +#include <linux/clk.h> > +#include <linux/clockchips.h> > +#include <linux/clocksource.h> > +#include <linux/interrupt.h> > +#include <linux/of_address.h> > +#include <linux/of_irq.h> > + > +#define TIMER_NAME "timer-keystone" > + > +/* Timer register offsets */ > +#define TIM12 0x10 > +#define TIM34 0x14 > +#define PRD12 0x18 > +#define PRD34 0x1c > +#define TCR 0x20 > +#define TGCR 0x24 > +#define INTCTLSTAT 0x44 > + > +/* Timer register bitfields */ > +#define TCR_ENAMODE_MASK 0xC0 > +#define TCR_ENAMODE_ONESHOT_MASK 0x40 > +#define TCR_ENAMODE_PERIODIC_MASK 0x80 > + > +#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 inline u32 keystone_timer_readl(unsigned long rg) > +{ > + return readl_relaxed(timer.base + rg); > +} > + > +static inline void keystone_timer_writel(u32 val, unsigned long rg) > +{ > + writel_relaxed(val, timer.base + rg); > +} > + > +/** > + * keystone_timer_config: configures timer to work in oneshot/periodic modes. > + * @ mode: mode to configure > + * @ period: cycles number to configure for > + */ > +static int keystone_timer_config(u64 period, enum clock_event_mode mode) > +{ > + u32 tcr; > + u32 off; > + > + tcr = keystone_timer_readl(TCR); > + off = tcr & ~(TCR_ENAMODE_MASK); > + > + /* set enable mode */ > + switch (mode) { > + case CLOCK_EVT_MODE_ONESHOT: > + tcr |= TCR_ENAMODE_ONESHOT_MASK; > + break; > + case CLOCK_EVT_MODE_PERIODIC: > + tcr |= TCR_ENAMODE_PERIODIC_MASK; > + break; > + default: > + return -1; > + } > + > + /* disable timer */ > + keystone_timer_writel(off, TCR); > + /* here we have to be sure the timer has been disabled */ > + wmb(); > + > + /* reset counter to zero, set new period */ > + keystone_timer_writel(0, TIM12); > + keystone_timer_writel(0, TIM34); > + keystone_timer_writel(period & 0xffffffff, PRD12); > + keystone_timer_writel(period >> 32, PRD34); > + > + /* > + * enable timer > + * here we have to be sure that CNTLO, CNTHI, PRDLO, PRDHI registers > + * have been written. > + */ > + wmb(); > + keystone_timer_writel(tcr, TCR); > + return 0; > +} > + > +static void keystone_timer_disable(void) > +{ > + u32 tcr; > + > + tcr = keystone_timer_readl(TCR); > + > + /* disable timer */ > + tcr &= ~(TCR_ENAMODE_MASK); > + keystone_timer_writel(tcr, TCR); > +} > + > +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; > +} > + > +static int keystone_set_next_event(unsigned long cycles, > + struct clock_event_device *evt) > +{ > + return keystone_timer_config(cycles, evt->mode); > +} > + > +static void keystone_set_mode(enum clock_event_mode mode, > + struct clock_event_device *evt) > +{ > + switch (mode) { > + case CLOCK_EVT_MODE_PERIODIC: > + keystone_timer_config(timer.hz_period, CLOCK_EVT_MODE_PERIODIC); > + break; > + case CLOCK_EVT_MODE_UNUSED: > + case CLOCK_EVT_MODE_SHUTDOWN: > + case CLOCK_EVT_MODE_ONESHOT: > + keystone_timer_disable(); > + break; > + default: > + break; > + } > +} > + > +static void __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; > + u32 tgcr; > + > + irq = irq_of_parse_and_map(np, 0); > + if (irq == NO_IRQ) { > + pr_err("%s: failed to map interrupts\n", __func__); > + return; > + } > + > + timer.base = of_iomap(np, 0); > + if (!timer.base) { > + pr_err("%s: failed to map registers\n", __func__); > + return; > + } > + > + clk = of_clk_get(np, 0); > + if (!clk) { > + pr_err("%s: failed to get clock\n", __func__); > + iounmap(timer.base); > + return; > + } > + > + error = clk_prepare_enable(clk); > + if (error) { > + pr_err("%s: failed to enable clock\n", __func__); > + goto err; > + } > + > + rate = clk_get_rate(clk); > + > + /* disable, use internal clock source */ > + keystone_timer_writel(0, TCR); > + /* here we have to be sure the timer has been disabled */ > + wmb(); > + > + /* reset timer as 64-bit, no pre-scaler, plus features are disabled */ > + tgcr = 0; > + keystone_timer_writel(0, TGCR); > + > + /* unreset timer */ > + tgcr |= TGCR_TIM_UNRESET_MASK; > + keystone_timer_writel(tgcr, TGCR); > + > + /* init counter to zero */ > + 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_mode = keystone_set_mode; > + 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); > + return; > +err: > + clk_put(clk); > + iounmap(timer.base); > +} > + > +CLOCKSOURCE_OF_DECLARE(keystone_timer, "ti,keystone-timer", > + keystone_timer_init); -- Regards, Ivan Khoronzhuk ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 11:30 ` [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone Ivan Khoronzhuk 2014-02-04 11:41 ` Ivan Khoronzhuk @ 2014-02-04 16:24 ` Thomas Gleixner 2014-02-04 16:54 ` Ivan Khoronzhuk 1 sibling, 1 reply; 11+ messages in thread From: Thomas Gleixner @ 2014-02-04 16:24 UTC (permalink / raw) To: Ivan Khoronzhuk Cc: santosh.shilimkar, rob, linux, galak, robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko On Tue, 4 Feb 2014, Ivan Khoronzhuk wrote: > + keystone_timer_writel(off, TCR); > + /* here we have to be sure the timer has been disabled */ > + wmb(); We have explicit writew_relaxed and writew. Why open coding the barriers? Thanks, tglx ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 16:24 ` Thomas Gleixner @ 2014-02-04 16:54 ` Ivan Khoronzhuk 2014-02-04 20:17 ` Thomas Gleixner 0 siblings, 1 reply; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 16:54 UTC (permalink / raw) To: Thomas Gleixner Cc: santosh.shilimkar, rob, linux, galak, robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko It was so in v1. But it was decided to use explicit memory barriers, because we're always sure the memory barriers are there and that they're properly documented. Also in this case I don't need to add keystone readl/writel relaxed function variants and to use mixed calls of writel/writel_relaxed functions. See: http://www.spinics.net/lists/arm-kernel/msg294941.html On 02/04/2014 06:24 PM, Thomas Gleixner wrote: > On Tue, 4 Feb 2014, Ivan Khoronzhuk wrote: >> + keystone_timer_writel(off, TCR); >> + /* here we have to be sure the timer has been disabled */ >> + wmb(); > We have explicit writew_relaxed and writew. Why open coding the > barriers? > > Thanks, > > tglx -- Regards, Ivan Khoronzhuk ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 16:54 ` Ivan Khoronzhuk @ 2014-02-04 20:17 ` Thomas Gleixner 2014-02-04 22:15 ` Santosh Shilimkar 0 siblings, 1 reply; 11+ messages in thread From: Thomas Gleixner @ 2014-02-04 20:17 UTC (permalink / raw) To: Ivan Khoronzhuk Cc: santosh.shilimkar, rob, linux, galak, robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko On Tue, 4 Feb 2014, Ivan Khoronzhuk wrote: Please do not top post. > It was so in v1. But it was decided to use explicit memory barriers, > because we're always sure the memory barriers are there and that > they're properly documented. Also in this case I don't need to add > keystone readl/writel relaxed function variants and to use mixed calls of > writel/writel_relaxed functions. > > See: > http://www.spinics.net/lists/arm-kernel/msg294941.html Fair enough, but we want a proper explanation for explicit barriers in the code and not in some random discussion of patch version X on some random mailing list. Aside of that it should be iowmb(), but I might miss something ... Thanks, tglx ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 20:17 ` Thomas Gleixner @ 2014-02-04 22:15 ` Santosh Shilimkar 2014-02-04 22:35 ` Ivan Khoronzhuk 0 siblings, 1 reply; 11+ messages in thread From: Santosh Shilimkar @ 2014-02-04 22:15 UTC (permalink / raw) To: Thomas Gleixner Cc: mark.rutland, devicetree, grygorii.strashko, linux, pawel.moll, ijc+devicetree, daniel.lezcano, linux-doc, linux-kernel, robh+dt, rob, galak, Ivan Khoronzhuk, linux-arm-kernel On Tuesday 04 February 2014 03:17 PM, Thomas Gleixner wrote: > On Tue, 4 Feb 2014, Ivan Khoronzhuk wrote: > > Please do not top post. > >> It was so in v1. But it was decided to use explicit memory barriers, >> because we're always sure the memory barriers are there and that >> they're properly documented. Also in this case I don't need to add >> keystone readl/writel relaxed function variants and to use mixed calls of >> writel/writel_relaxed functions. >> >> See: >> http://www.spinics.net/lists/arm-kernel/msg294941.html > > Fair enough, but we want a proper explanation for explicit barriers in > the code and not in some random discussion of patch version X on some > random mailing list. > > Aside of that it should be iowmb(), but I might miss something ... > Agree. __iowmb() seems to be more appropriate. Regards, Santosh ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone 2014-02-04 22:15 ` Santosh Shilimkar @ 2014-02-04 22:35 ` Ivan Khoronzhuk 0 siblings, 0 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 22:35 UTC (permalink / raw) To: Santosh Shilimkar, Thomas Gleixner Cc: rob, linux, galak, robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko Yes. I'll send with __iowmb() instead of wmb(). On 02/05/2014 12:15 AM, Santosh Shilimkar wrote: > On Tuesday 04 February 2014 03:17 PM, Thomas Gleixner wrote: >> On Tue, 4 Feb 2014, Ivan Khoronzhuk wrote: >> >> Please do not top post. >> >>> It was so in v1. But it was decided to use explicit memory barriers, >>> because we're always sure the memory barriers are there and that >>> they're properly documented. Also in this case I don't need to add >>> keystone readl/writel relaxed function variants and to use mixed calls of >>> writel/writel_relaxed functions. >>> >>> See: >>> http://www.spinics.net/lists/arm-kernel/msg294941.html >> Fair enough, but we want a proper explanation for explicit barriers in >> the code and not in some random discussion of patch version X on some >> random mailing list. >> >> Aside of that it should be iowmb(), but I might miss something ... >> > Agree. __iowmb() seems to be more appropriate. > > Regards, > Santosh > -- Regards, Ivan Khoronzhuk ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <1391513453-21140-1-git-send-email-ivan.khoronzhuk-l0cyMroinI0@public.gmane.org>]
* [PATCH v4 2/3] clocksource: keystone: add bindings for keystone timer [not found] ` <1391513453-21140-1-git-send-email-ivan.khoronzhuk-l0cyMroinI0@public.gmane.org> @ 2014-02-04 11:30 ` Ivan Khoronzhuk 2014-02-04 11:42 ` Ivan Khoronzhuk 0 siblings, 1 reply; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:30 UTC (permalink / raw) To: santosh.shilimkar-l0cyMroinI0, rob-VoJi6FS/r0vR7s880joybQ, linux-lFZ/pmaqli7XmaaqVzeoHQ, galak-sgV2jX0FEOL9JmXXK+q4OQ Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8, mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg, daniel.lezcano-QSEj5FYQhm4dnm+yROfE0A, tglx-hfZtesqFncYOwBW4kG4KsQ, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-doc-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-kernel-u79uwXL29TY76Z2rM5mHXA, grygorii.strashko-l0cyMroinI0, Ivan Khoronzhuk This patch provides bindings for the 64-bit timer in the KeyStone architecture devices. The timer can be configured as a general-purpose 64-bit timer, dual general-purpose 32-bit timers. When configured as dual 32-bit timers, each half can operate in conjunction (chain mode) or independently (unchained mode) of each other. It is global timer is a free running up-counter and can generate interrupt when the counter reaches preset counter values. Documentation: http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk-l0cyMroinI0@public.gmane.org> --- .../bindings/timer/ti,keystone-timer.txt | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Documentation/devicetree/bindings/timer/ti,keystone-timer.txt diff --git a/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt b/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt new file mode 100644 index 0000000..5fbe361 --- /dev/null +++ b/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt @@ -0,0 +1,29 @@ +* Device tree bindings for Texas instruments Keystone timer + +This document provides bindings for the 64-bit timer in the KeyStone +architecture devices. The timer can be configured as a general-purpose 64-bit +timer, dual general-purpose 32-bit timers. When configured as dual 32-bit +timers, each half can operate in conjunction (chain mode) or independently +(unchained mode) of each other. + +It is global timer is a free running up-counter and can generate interrupt +when the counter reaches preset counter values. + +Documentation: +http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf + +Required properties: + +- compatible : should be "ti,keystone-timer". +- reg : specifies base physical address and count of the registers. +- interrupts : interrupt generated by the timer. +- clocks : the clock feeding the timer clock. + +Example: + +timer@22f0000 { + compatible = "ti,keystone-timer"; + reg = <0x022f0000 0x80>; + interrupts = <GIC_SPI 110 IRQ_TYPE_EDGE_RISING>; + clocks = <&clktimer15>; +}; -- 1.8.3.2 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 2/3] clocksource: keystone: add bindings for keystone timer 2014-02-04 11:30 ` [PATCH v4 2/3] clocksource: keystone: add bindings for keystone timer Ivan Khoronzhuk @ 2014-02-04 11:42 ` Ivan Khoronzhuk 0 siblings, 0 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:42 UTC (permalink / raw) To: santosh.shilimkar, rob, linux, galak Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, tglx, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko, Ivan Khoronzhuk Sorry I forgot to add Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> On 02/04/2014 01:30 PM, Ivan Khoronzhuk wrote: > This patch provides bindings for the 64-bit timer in the KeyStone > architecture devices. The timer can be configured as a general-purpose 64-bit > timer, dual general-purpose 32-bit timers. When configured as dual 32-bit > timers, each half can operate in conjunction (chain mode) or independently > (unchained mode) of each other. > > It is global timer is a free running up-counter and can generate interrupt > when the counter reaches preset counter values. > > Documentation: > http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf > > Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> > --- > .../bindings/timer/ti,keystone-timer.txt | 29 ++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > create mode 100644 Documentation/devicetree/bindings/timer/ti,keystone-timer.txt > > diff --git a/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt b/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt > new file mode 100644 > index 0000000..5fbe361 > --- /dev/null > +++ b/Documentation/devicetree/bindings/timer/ti,keystone-timer.txt > @@ -0,0 +1,29 @@ > +* Device tree bindings for Texas instruments Keystone timer > + > +This document provides bindings for the 64-bit timer in the KeyStone > +architecture devices. The timer can be configured as a general-purpose 64-bit > +timer, dual general-purpose 32-bit timers. When configured as dual 32-bit > +timers, each half can operate in conjunction (chain mode) or independently > +(unchained mode) of each other. > + > +It is global timer is a free running up-counter and can generate interrupt > +when the counter reaches preset counter values. > + > +Documentation: > +http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf > + > +Required properties: > + > +- compatible : should be "ti,keystone-timer". > +- reg : specifies base physical address and count of the registers. > +- interrupts : interrupt generated by the timer. > +- clocks : the clock feeding the timer clock. > + > +Example: > + > +timer@22f0000 { > + compatible = "ti,keystone-timer"; > + reg = <0x022f0000 0x80>; > + interrupts = <GIC_SPI 110 IRQ_TYPE_EDGE_RISING>; > + clocks = <&clktimer15>; > +}; -- Regards, Ivan Khoronzhuk ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 3/3] arm: dts: keystone: add keystone timer entry 2014-02-04 11:30 [PATCH v4 0/3] Introduce clocksource driver for Keystone platform Ivan Khoronzhuk 2014-02-04 11:30 ` [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone Ivan Khoronzhuk [not found] ` <1391513453-21140-1-git-send-email-ivan.khoronzhuk-l0cyMroinI0@public.gmane.org> @ 2014-02-04 11:30 ` Ivan Khoronzhuk 2 siblings, 0 replies; 11+ messages in thread From: Ivan Khoronzhuk @ 2014-02-04 11:30 UTC (permalink / raw) To: santosh.shilimkar, rob, linux, galak Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, daniel.lezcano, tglx, devicetree, linux-doc, linux-arm-kernel, linux-kernel, grygorii.strashko, Ivan Khoronzhuk Add keystone timer entry to keystone device tree. This 64-bit timer is used as backup clock event device. Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> --- arch/arm/boot/dts/keystone-clocks.dtsi | 10 ++++++++++ arch/arm/boot/dts/keystone.dtsi | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/arch/arm/boot/dts/keystone-clocks.dtsi b/arch/arm/boot/dts/keystone-clocks.dtsi index 2363593..16d2aba 100644 --- a/arch/arm/boot/dts/keystone-clocks.dtsi +++ b/arch/arm/boot/dts/keystone-clocks.dtsi @@ -737,6 +737,16 @@ clocks { domain-id = <0>; }; + clktimer15: clktimer15 { + #clock-cells = <0>; + compatible = "ti,keystone,psc-clock"; + clocks = <&clkmodrst0>; + clock-output-names = "timer15"; + reg = <0x02350000 0xb00>, <0x02350000 0x400>; + reg-names = "control", "domain"; + domain-id = <0>; + }; + clkuart0: clkuart0 { #clock-cells = <0>; compatible = "ti,keystone,psc-clock"; diff --git a/arch/arm/boot/dts/keystone.dtsi b/arch/arm/boot/dts/keystone.dtsi index b420290..cac9841 100644 --- a/arch/arm/boot/dts/keystone.dtsi +++ b/arch/arm/boot/dts/keystone.dtsi @@ -208,5 +208,12 @@ usb-phy = <&usb_phy>, <&usb_phy>; }; }; + + clock_event: timer@22f0000 { + compatible = "ti,keystone-timer"; + reg = <0x022f0000 0x80>; + interrupts = <GIC_SPI 110 IRQ_TYPE_EDGE_RISING>; + clocks = <&clktimer15>; + }; }; }; -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-02-04 22:35 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-02-04 11:30 [PATCH v4 0/3] Introduce clocksource driver for Keystone platform Ivan Khoronzhuk 2014-02-04 11:30 ` [PATCH v4 1/3] clocksource: timer-keystone: introduce clocksource driver for Keystone Ivan Khoronzhuk 2014-02-04 11:41 ` Ivan Khoronzhuk 2014-02-04 16:24 ` Thomas Gleixner 2014-02-04 16:54 ` Ivan Khoronzhuk 2014-02-04 20:17 ` Thomas Gleixner 2014-02-04 22:15 ` Santosh Shilimkar 2014-02-04 22:35 ` Ivan Khoronzhuk [not found] ` <1391513453-21140-1-git-send-email-ivan.khoronzhuk-l0cyMroinI0@public.gmane.org> 2014-02-04 11:30 ` [PATCH v4 2/3] clocksource: keystone: add bindings for keystone timer Ivan Khoronzhuk 2014-02-04 11:42 ` Ivan Khoronzhuk 2014-02-04 11:30 ` [PATCH v4 3/3] arm: dts: keystone: add keystone timer entry Ivan Khoronzhuk
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).