* [PATCH] clocksource driver for Alphascale asm9260 [not found] <1417193657-31602-2-git-send-email-linux@rempel-privat.de> @ 2015-01-08 9:07 ` Oleksij Rempel 2015-01-08 9:07 ` [PATCH] ARM: clocksource: add asm9260_timer driver Oleksij Rempel 0 siblings, 1 reply; 7+ messages in thread From: Oleksij Rempel @ 2015-01-08 9:07 UTC (permalink / raw) To: daniel.lezcano, tglx, linux-kernel, linux-arm-kernel; +Cc: Oleksij Rempel Hello, this patch provides clocksource support for Alphascale asm9260 SoC. As was suggested..., I explicitly ask you to merge this patch :D Oleksij Rempel (1): ARM: clocksource: add asm9260_timer driver drivers/clocksource/Kconfig | 9 ++ drivers/clocksource/Makefile | 1 + drivers/clocksource/asm9260_timer.c | 220 ++++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 drivers/clocksource/asm9260_timer.c -- 1.9.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] ARM: clocksource: add asm9260_timer driver 2015-01-08 9:07 ` [PATCH] clocksource driver for Alphascale asm9260 Oleksij Rempel @ 2015-01-08 9:07 ` Oleksij Rempel 2015-01-20 13:56 ` Daniel Lezcano 0 siblings, 1 reply; 7+ messages in thread From: Oleksij Rempel @ 2015-01-08 9:07 UTC (permalink / raw) To: daniel.lezcano, tglx, linux-kernel, linux-arm-kernel; +Cc: Oleksij Rempel In some cases asm9260 looks similar to iMX2x. One of exceptions is timer controller. So this patch introduces new driver for this special case. Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> --- drivers/clocksource/Kconfig | 9 ++ drivers/clocksource/Makefile | 1 + drivers/clocksource/asm9260_timer.c | 220 ++++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 drivers/clocksource/asm9260_timer.c diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index f657a48..2d38bf6 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -224,4 +224,13 @@ config CLKSRC_VERSATILE ARM Versatile, RealView and Versatile Express reference platforms. +config ASM9260_TIMER + bool "Alphascale ASM9260 timer driver" + select CLKSRC_MMIO + select CLKSRC_OF + default y if MACH_ASM9260 + help + This enables build of a clocksource and clockevent driver for + the 32-bit System Timer hardware available on a Alphascale ASM9260. + endmenu diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index fae0435..3da4665 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -47,3 +47,4 @@ obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o obj-$(CONFIG_ARCH_KEYSTONE) += timer-keystone.o obj-$(CONFIG_ARCH_INTEGRATOR_AP) += timer-integrator-ap.o obj-$(CONFIG_CLKSRC_VERSATILE) += versatile.o +obj-$(CONFIG_ASM9260_TIMER) += asm9260_timer.o diff --git a/drivers/clocksource/asm9260_timer.c b/drivers/clocksource/asm9260_timer.c new file mode 100644 index 0000000..2c9c993 --- /dev/null +++ b/drivers/clocksource/asm9260_timer.c @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2014 Oleksij Rempel <linux@rempel-privat.de> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/sched.h> +#include <linux/clk.h> +#include <linux/clocksource.h> +#include <linux/clockchips.h> +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/bitops.h> + +#define DRIVER_NAME "asm9260-timer" + +/* + * this device provide 4 offsets for each register: + * 0x0 - plain read write mode + * 0x4 - set mode, OR logic. + * 0x8 - clr mode, XOR logic. + * 0xc - togle mode. + */ +#define SET_REG 4 +#define CLR_REG 8 + +#define HW_IR 0x0000 /* RW. Interrupt */ +#define BM_IR_CR0 BIT(4) +#define BM_IR_MR3 BIT(3) +#define BM_IR_MR2 BIT(2) +#define BM_IR_MR1 BIT(1) +#define BM_IR_MR0 BIT(0) + +#define HW_TCR 0x0010 /* RW. Timer controller */ +/* BM_C*_RST + * Timer Counter and the Prescale Counter are synchronously reset on the + * next positive edge of PCLK. The counters remain reset until TCR[1] is + * returned to zero. */ +#define BM_C3_RST BIT(7) +#define BM_C2_RST BIT(6) +#define BM_C1_RST BIT(5) +#define BM_C0_RST BIT(4) +/* BM_C*_EN + * 1 - Timer Counter and Prescale Counter are enabled for counting + * 0 - counters are disabled */ +#define BM_C3_EN BIT(3) +#define BM_C2_EN BIT(2) +#define BM_C1_EN BIT(1) +#define BM_C0_EN BIT(0) + +#define HW_DIR 0x0020 /* RW. Direction? */ +/* 00 - count up + * 01 - count down + * 10 - ?? 2^n/2 */ +#define BM_DIR_COUNT_UP 0 +#define BM_DIR_COUNT_DOWN 1 +#define BM_DIR0_SHIFT 0 +#define BM_DIR1_SHIFT 4 +#define BM_DIR2_SHIFT 8 +#define BM_DIR3_SHIFT 12 +#define BM_DIR_DEFAULT (BM_DIR_COUNT_UP << BM_DIR0_SHIFT | \ + BM_DIR_COUNT_UP << BM_DIR1_SHIFT | \ + BM_DIR_COUNT_UP << BM_DIR2_SHIFT | \ + BM_DIR_COUNT_UP << BM_DIR3_SHIFT) + +#define HW_TC0 0x0030 /* RO. Timer counter 0 */ +/* HW_TC*. Timer counter owerflow (0xffff.ffff to 0x0000.0000) do not generate + * interrupt. This registers can be used to detect overflow */ +#define HW_TC1 0x0040 +#define HW_TC2 0x0050 +#define HW_TC3 0x0060 + +#define HW_PR 0x0070 /* RW. prescaler */ +#define BM_PR_DISABLE 0 +#define HW_PC 0x0080 /* RO. Prescaler counter */ +#define HW_MCR 0x0090 /* RW. Match control */ +/* enable interrupt on match */ +#define BM_MCR_INT_EN(n) (1 << (n * 3 + 0)) +/* enable TC reset on match */ +#define BM_MCR_RES_EN(n) (1 << (n * 3 + 1)) +/* enable stop TC on match */ +#define BM_MCR_STOP_EN(n) (1 << (n * 3 + 2)) + +#define HW_MR0 0x00a0 /* RW. Match reg */ +#define HW_MR1 0x00b0 +#define HW_MR2 0x00C0 +#define HW_MR3 0x00D0 + +#define HW_CTCR 0x0180 /* Counter control */ +#define BM_CTCR0_SHIFT 0 +#define BM_CTCR1_SHIFT 2 +#define BM_CTCR2_SHIFT 4 +#define BM_CTCR3_SHIFT 6 +#define BM_CTCR_TM 0 /* Timer mode. Every rising PCLK edge. */ +#define BM_CTCR_DEFAULT (BM_CTCR_TM << BM_CTCR0_SHIFT | \ + BM_CTCR_TM << BM_CTCR1_SHIFT | \ + BM_CTCR_TM << BM_CTCR2_SHIFT | \ + BM_CTCR_TM << BM_CTCR3_SHIFT) + +static struct asm9260_timer_priv { + void __iomem *base; + unsigned long ticks_per_jiffy; +} priv; + +static int asm9260_timer_set_next_event(unsigned long delta, + struct clock_event_device *evt) +{ + /* configure match count for TC0 */ + writel_relaxed(delta, priv.base + HW_MR0); + /* enable TC0 */ + writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG); + return 0; +} + +static void asm9260_timer_set_mode(enum clock_event_mode mode, + struct clock_event_device *evt) +{ + /* stop timer0 */ + writel_relaxed(BM_C0_EN, priv.base + HW_TCR + CLR_REG); + + switch (mode) { + case CLOCK_EVT_MODE_PERIODIC: + /* disable reset and stop on match */ + writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0), + priv.base + HW_MCR + CLR_REG); + /* configure match count for TC0 */ + writel_relaxed(priv.ticks_per_jiffy, priv.base + HW_MR0); + /* enable TC0 */ + writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG); + break; + case CLOCK_EVT_MODE_ONESHOT: + /* enable reset and stop on match */ + writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0), + priv.base + HW_MCR + SET_REG); + break; + default: + break; + } +} + +static struct clock_event_device event_dev = { + .name = DRIVER_NAME, + .rating = 200, + .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, + .set_next_event = asm9260_timer_set_next_event, + .set_mode = asm9260_timer_set_mode, +}; + +static irqreturn_t asm9260_timer_interrupt(int irq, void *dev_id) +{ + struct clock_event_device *evt = dev_id; + + evt->event_handler(evt); + + writel_relaxed(BM_IR_MR0, priv.base + HW_IR); + + return IRQ_HANDLED; +} + +/* + * --------------------------------------------------------------------------- + * Timer initialization + * --------------------------------------------------------------------------- + */ +static void __init asm9260_timer_init(struct device_node *np) +{ + int irq; + struct clk *clk; + int ret; + unsigned long rate; + + priv.base = of_io_request_and_map(np, 0, np->name); + if (!priv.base) + panic("%s: unable to map resource", np->name); + + clk = of_clk_get(np, 0); + + ret = clk_prepare_enable(clk); + if (ret) + panic("Failed to enable clk!\n"); + + irq = irq_of_parse_and_map(np, 0); + ret = request_irq(irq, asm9260_timer_interrupt, IRQF_TIMER, + DRIVER_NAME, &event_dev); + if (ret) + panic("Failed to setup irq!\n"); + + /* set all timers for count-up */ + writel_relaxed(BM_DIR_DEFAULT, priv.base + HW_DIR); + /* disable divider */ + writel_relaxed(BM_PR_DISABLE, priv.base + HW_PR); + /* make sure all timers use every rising PCLK edge. */ + writel_relaxed(BM_CTCR_DEFAULT, priv.base + HW_CTCR); + /* enable interrupt for TC0 and clean setting for all other lines */ + writel_relaxed(BM_MCR_INT_EN(0) , priv.base + HW_MCR); + + rate = clk_get_rate(clk); + clocksource_mmio_init(priv.base + HW_TC1, DRIVER_NAME, rate, + 200, 32, clocksource_mmio_readl_up); + + /* Seems like we can't use counter without match register even if + * actions for MR are disabled. So, set MR to max value. */ + writel_relaxed(0xffffffff, priv.base + HW_MR1); + /* enable TC1 */ + writel_relaxed(BM_C1_EN, priv.base + HW_TCR + SET_REG); + + priv.ticks_per_jiffy = DIV_ROUND_CLOSEST(rate, HZ); + event_dev.cpumask = cpumask_of(0); + clockevents_config_and_register(&event_dev, rate, 0x2c00, 0xfffffffe); +} +CLOCKSOURCE_OF_DECLARE(asm9260_timer, "alphascale,asm9260-timer", + asm9260_timer_init); -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] ARM: clocksource: add asm9260_timer driver 2015-01-08 9:07 ` [PATCH] ARM: clocksource: add asm9260_timer driver Oleksij Rempel @ 2015-01-20 13:56 ` Daniel Lezcano 2015-01-27 7:27 ` [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc Oleksij Rempel 0 siblings, 1 reply; 7+ messages in thread From: Daniel Lezcano @ 2015-01-20 13:56 UTC (permalink / raw) To: Oleksij Rempel, tglx, linux-kernel, linux-arm-kernel On 01/08/2015 10:07 AM, Oleksij Rempel wrote: > In some cases asm9260 looks similar to iMX2x. One of exceptions is > timer controller. So this patch introduces new driver for this special case. > > Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> > Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Fixed conflict in the Makefile and applied to my tree. Thanks ! -- Daniel -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc 2015-01-20 13:56 ` Daniel Lezcano @ 2015-01-27 7:27 ` Oleksij Rempel 2015-01-27 8:49 ` Daniel Lezcano 0 siblings, 1 reply; 7+ messages in thread From: Oleksij Rempel @ 2015-01-27 7:27 UTC (permalink / raw) To: daniel.lezcano, linux-kernel, tglx; +Cc: Oleksij Rempel make sure this driver depends on GENERIC_CLOCKEVENTS compiler error was found by kbuild test robot: >> drivers/clocksource/asm9260_timer.c:114:14: warning: its scope is only this definition or declaration, which is probably not what you want >> drivers/clocksource/asm9260_timer.c:124:16: warning: 'struct clock_event_device' declared inside parameter list struct clock_event_device *evt) >> drivers/clocksource/asm9260_timer.c:124:16: warning: 'enum clock_event_mode' declared inside parameter list >> drivers/clocksource/asm9260_timer.c:123:58: error: parameter 1 ('mode') has incomplete type static void asm9260_timer_set_mode(enum clock_event_mode mode, Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> --- drivers/clocksource/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 13b8152..bfaaae4 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -231,6 +231,7 @@ config CLKSRC_MIPS_GIC config ASM9260_TIMER bool "Alphascale ASM9260 timer driver" + depends on GENERIC_CLOCKEVENTS select CLKSRC_MMIO select CLKSRC_OF default y if MACH_ASM9260 -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc 2015-01-27 7:27 ` [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc Oleksij Rempel @ 2015-01-27 8:49 ` Daniel Lezcano 2015-01-27 8:51 ` Oleksij Rempel 0 siblings, 1 reply; 7+ messages in thread From: Daniel Lezcano @ 2015-01-27 8:49 UTC (permalink / raw) To: Oleksij Rempel, linux-kernel, tglx On 01/27/2015 08:27 AM, Oleksij Rempel wrote: > make sure this driver depends on GENERIC_CLOCKEVENTS > > compiler error was found by kbuild test robot: > >>> drivers/clocksource/asm9260_timer.c:114:14: warning: its scope is only this definition or declaration, which is probably not what you want >>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'struct clock_event_device' declared inside parameter list > struct clock_event_device *evt) > >>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'enum clock_event_mode' declared inside parameter list >>> drivers/clocksource/asm9260_timer.c:123:58: error: parameter 1 ('mode') has incomplete type > static void asm9260_timer_set_mode(enum clock_event_mode mode, > > Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> I would like to fold this patch with the asm9260 timer patch in order to prevent git bisecting breakage. Ok for you ? > --- > drivers/clocksource/Kconfig | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig > index 13b8152..bfaaae4 100644 > --- a/drivers/clocksource/Kconfig > +++ b/drivers/clocksource/Kconfig > @@ -231,6 +231,7 @@ config CLKSRC_MIPS_GIC > > config ASM9260_TIMER > bool "Alphascale ASM9260 timer driver" > + depends on GENERIC_CLOCKEVENTS > select CLKSRC_MMIO > select CLKSRC_OF > default y if MACH_ASM9260 > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc 2015-01-27 8:49 ` Daniel Lezcano @ 2015-01-27 8:51 ` Oleksij Rempel 2015-01-27 9:05 ` Daniel Lezcano 0 siblings, 1 reply; 7+ messages in thread From: Oleksij Rempel @ 2015-01-27 8:51 UTC (permalink / raw) To: Daniel Lezcano, linux-kernel, tglx [-- Attachment #1: Type: text/plain, Size: 1630 bytes --] Am 27.01.2015 um 09:49 schrieb Daniel Lezcano: > On 01/27/2015 08:27 AM, Oleksij Rempel wrote: >> make sure this driver depends on GENERIC_CLOCKEVENTS >> >> compiler error was found by kbuild test robot: >> >>>> drivers/clocksource/asm9260_timer.c:114:14: warning: its scope is >>>> only this definition or declaration, which is probably not what you >>>> want >>>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'struct >>>> clock_event_device' declared inside parameter list >> struct clock_event_device *evt) >> >>>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'enum >>>> clock_event_mode' declared inside parameter list >>>> drivers/clocksource/asm9260_timer.c:123:58: error: parameter 1 >>>> ('mode') has incomplete type >> static void asm9260_timer_set_mode(enum clock_event_mode mode, >> >> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> > > I would like to fold this patch with the asm9260 timer patch in order to > prevent git bisecting breakage. Ok for you ? Ok, no problem. >> --- >> drivers/clocksource/Kconfig | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig >> index 13b8152..bfaaae4 100644 >> --- a/drivers/clocksource/Kconfig >> +++ b/drivers/clocksource/Kconfig >> @@ -231,6 +231,7 @@ config CLKSRC_MIPS_GIC >> >> config ASM9260_TIMER >> bool "Alphascale ASM9260 timer driver" >> + depends on GENERIC_CLOCKEVENTS >> select CLKSRC_MMIO >> select CLKSRC_OF >> default y if MACH_ASM9260 >> > > -- Regards, Oleksij [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 213 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc 2015-01-27 8:51 ` Oleksij Rempel @ 2015-01-27 9:05 ` Daniel Lezcano 0 siblings, 0 replies; 7+ messages in thread From: Daniel Lezcano @ 2015-01-27 9:05 UTC (permalink / raw) To: Oleksij Rempel, linux-kernel, tglx On 01/27/2015 09:51 AM, Oleksij Rempel wrote: > Am 27.01.2015 um 09:49 schrieb Daniel Lezcano: >> On 01/27/2015 08:27 AM, Oleksij Rempel wrote: >>> make sure this driver depends on GENERIC_CLOCKEVENTS >>> >>> compiler error was found by kbuild test robot: >>> >>>>> drivers/clocksource/asm9260_timer.c:114:14: warning: its scope is >>>>> only this definition or declaration, which is probably not what you >>>>> want >>>>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'struct >>>>> clock_event_device' declared inside parameter list >>> struct clock_event_device *evt) >>> >>>>> drivers/clocksource/asm9260_timer.c:124:16: warning: 'enum >>>>> clock_event_mode' declared inside parameter list >>>>> drivers/clocksource/asm9260_timer.c:123:58: error: parameter 1 >>>>> ('mode') has incomplete type >>> static void asm9260_timer_set_mode(enum clock_event_mode mode, >>> >>> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de> >> >> I would like to fold this patch with the asm9260 timer patch in order to >> prevent git bisecting breakage. Ok for you ? > > Ok, no problem. Done. -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-01-27 9:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1417193657-31602-2-git-send-email-linux@rempel-privat.de>
2015-01-08 9:07 ` [PATCH] clocksource driver for Alphascale asm9260 Oleksij Rempel
2015-01-08 9:07 ` [PATCH] ARM: clocksource: add asm9260_timer driver Oleksij Rempel
2015-01-20 13:56 ` Daniel Lezcano
2015-01-27 7:27 ` [PATCH] ARM: clocksource: fix compile of asm9260_timer driver on ARCH=parisc Oleksij Rempel
2015-01-27 8:49 ` Daniel Lezcano
2015-01-27 8:51 ` Oleksij Rempel
2015-01-27 9:05 ` Daniel Lezcano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox