* [PATCH 01/12] ARM: SAMSUNG: Move samsung-time to drivers/clocksource
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 02/12] clocksource: samsung-time: Set platform-specific parameters at runtime Tomasz Figa
` (11 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch moves the Samsung PWM-based high resolution timer support
code from arch/arm/plat-samsung to drivers/clocksource.
This is a prerequisite for further work on making the driver more
multiplatform and Device Tree friendly.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/plat-samsung/Kconfig | 8 -
arch/arm/plat-samsung/Makefile | 1 -
arch/arm/plat-samsung/samsung-time.c | 394 -----------------------------------
drivers/clocksource/Kconfig | 7 +
drivers/clocksource/Makefile | 1 +
drivers/clocksource/samsung-time.c | 394 +++++++++++++++++++++++++++++++++++
6 files changed, 402 insertions(+), 403 deletions(-)
delete mode 100644 arch/arm/plat-samsung/samsung-time.c
create mode 100644 drivers/clocksource/samsung-time.c
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig
index b708b3e..07ae984 100644
--- a/arch/arm/plat-samsung/Kconfig
+++ b/arch/arm/plat-samsung/Kconfig
@@ -68,14 +68,6 @@ config S3C_LOWLEVEL_UART_PORT
this configuration should be between zero and two. The port
must have been initialised by the boot-loader before use.
-# timer options
-
-config SAMSUNG_HRT
- bool
- select SAMSUNG_DEV_PWM
- help
- Use the High Resolution timer support
-
# clock options
config SAMSUNG_CLOCK
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile
index a23c460..87494e1 100644
--- a/arch/arm/plat-samsung/Makefile
+++ b/arch/arm/plat-samsung/Makefile
@@ -12,7 +12,6 @@ obj- :=
# Objects we always build independent of SoC choice
obj-y += init.o cpu.o
-obj-$(CONFIG_SAMSUNG_HRT) += samsung-time.o
obj-$(CONFIG_SAMSUNG_CLOCK) += clock.o
obj-$(CONFIG_SAMSUNG_CLOCK) += pwm-clock.o
diff --git a/arch/arm/plat-samsung/samsung-time.c b/arch/arm/plat-samsung/samsung-time.c
deleted file mode 100644
index f899cbc..0000000
--- a/arch/arm/plat-samsung/samsung-time.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- * http://www.samsung.com/
- *
- * samsung - Common hr-timer support (s3c and s5p)
- *
- * 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/interrupt.h>
-#include <linux/irq.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/clockchips.h>
-#include <linux/platform_device.h>
-
-#include <asm/smp_twd.h>
-#include <asm/mach/time.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/sched_clock.h>
-
-#include <mach/map.h>
-#include <plat/devs.h>
-#include <plat/regs-timer.h>
-#include <plat/samsung-time.h>
-
-static struct clk *tin_event;
-static struct clk *tin_source;
-static struct clk *tdiv_event;
-static struct clk *tdiv_source;
-static struct clk *timerclk;
-static struct samsung_timer_source timer_source;
-static unsigned long clock_count_per_tick;
-static void samsung_timer_resume(void);
-
-static void samsung_time_stop(enum samsung_timer_mode mode)
-{
- unsigned long tcon;
-
- tcon = __raw_readl(S3C2410_TCON);
-
- switch (mode) {
- case SAMSUNG_PWM0:
- tcon &= ~S3C2410_TCON_T0START;
- break;
-
- case SAMSUNG_PWM1:
- tcon &= ~S3C2410_TCON_T1START;
- break;
-
- case SAMSUNG_PWM2:
- tcon &= ~S3C2410_TCON_T2START;
- break;
-
- case SAMSUNG_PWM3:
- tcon &= ~S3C2410_TCON_T3START;
- break;
-
- case SAMSUNG_PWM4:
- tcon &= ~S3C2410_TCON_T4START;
- break;
-
- default:
- printk(KERN_ERR "Invalid Timer %d\n", mode);
- break;
- }
- __raw_writel(tcon, S3C2410_TCON);
-}
-
-static void samsung_time_setup(enum samsung_timer_mode mode, unsigned long tcnt)
-{
- unsigned long tcon;
-
- tcon = __raw_readl(S3C2410_TCON);
-
- tcnt--;
-
- switch (mode) {
- case SAMSUNG_PWM0:
- tcon &= ~(0x0f << 0);
- tcon |= S3C2410_TCON_T0MANUALUPD;
- break;
-
- case SAMSUNG_PWM1:
- tcon &= ~(0x0f << 8);
- tcon |= S3C2410_TCON_T1MANUALUPD;
- break;
-
- case SAMSUNG_PWM2:
- tcon &= ~(0x0f << 12);
- tcon |= S3C2410_TCON_T2MANUALUPD;
- break;
-
- case SAMSUNG_PWM3:
- tcon &= ~(0x0f << 16);
- tcon |= S3C2410_TCON_T3MANUALUPD;
- break;
-
- case SAMSUNG_PWM4:
- tcon &= ~(0x07 << 20);
- tcon |= S3C2410_TCON_T4MANUALUPD;
- break;
-
- default:
- printk(KERN_ERR "Invalid Timer %d\n", mode);
- break;
- }
-
- __raw_writel(tcnt, S3C2410_TCNTB(mode));
- __raw_writel(tcnt, S3C2410_TCMPB(mode));
- __raw_writel(tcon, S3C2410_TCON);
-}
-
-static void samsung_time_start(enum samsung_timer_mode mode, bool periodic)
-{
- unsigned long tcon;
-
- tcon = __raw_readl(S3C2410_TCON);
-
- switch (mode) {
- case SAMSUNG_PWM0:
- tcon |= S3C2410_TCON_T0START;
- tcon &= ~S3C2410_TCON_T0MANUALUPD;
-
- if (periodic)
- tcon |= S3C2410_TCON_T0RELOAD;
- else
- tcon &= ~S3C2410_TCON_T0RELOAD;
- break;
-
- case SAMSUNG_PWM1:
- tcon |= S3C2410_TCON_T1START;
- tcon &= ~S3C2410_TCON_T1MANUALUPD;
-
- if (periodic)
- tcon |= S3C2410_TCON_T1RELOAD;
- else
- tcon &= ~S3C2410_TCON_T1RELOAD;
- break;
-
- case SAMSUNG_PWM2:
- tcon |= S3C2410_TCON_T2START;
- tcon &= ~S3C2410_TCON_T2MANUALUPD;
-
- if (periodic)
- tcon |= S3C2410_TCON_T2RELOAD;
- else
- tcon &= ~S3C2410_TCON_T2RELOAD;
- break;
-
- case SAMSUNG_PWM3:
- tcon |= S3C2410_TCON_T3START;
- tcon &= ~S3C2410_TCON_T3MANUALUPD;
-
- if (periodic)
- tcon |= S3C2410_TCON_T3RELOAD;
- else
- tcon &= ~S3C2410_TCON_T3RELOAD;
- break;
-
- case SAMSUNG_PWM4:
- tcon |= S3C2410_TCON_T4START;
- tcon &= ~S3C2410_TCON_T4MANUALUPD;
-
- if (periodic)
- tcon |= S3C2410_TCON_T4RELOAD;
- else
- tcon &= ~S3C2410_TCON_T4RELOAD;
- break;
-
- default:
- printk(KERN_ERR "Invalid Timer %d\n", mode);
- break;
- }
- __raw_writel(tcon, S3C2410_TCON);
-}
-
-static int samsung_set_next_event(unsigned long cycles,
- struct clock_event_device *evt)
-{
- samsung_time_setup(timer_source.event_id, cycles);
- samsung_time_start(timer_source.event_id, NON_PERIODIC);
-
- return 0;
-}
-
-static void samsung_set_mode(enum clock_event_mode mode,
- struct clock_event_device *evt)
-{
- samsung_time_stop(timer_source.event_id);
-
- switch (mode) {
- case CLOCK_EVT_MODE_PERIODIC:
- samsung_time_setup(timer_source.event_id, clock_count_per_tick);
- samsung_time_start(timer_source.event_id, PERIODIC);
- break;
-
- case CLOCK_EVT_MODE_ONESHOT:
- break;
-
- case CLOCK_EVT_MODE_UNUSED:
- case CLOCK_EVT_MODE_SHUTDOWN:
- break;
-
- case CLOCK_EVT_MODE_RESUME:
- samsung_timer_resume();
- break;
- }
-}
-
-static void samsung_timer_resume(void)
-{
- /* event timer restart */
- samsung_time_setup(timer_source.event_id, clock_count_per_tick);
- samsung_time_start(timer_source.event_id, PERIODIC);
-
- /* source timer restart */
- samsung_time_setup(timer_source.source_id, TCNT_MAX);
- samsung_time_start(timer_source.source_id, PERIODIC);
-}
-
-void __init samsung_set_timer_source(enum samsung_timer_mode event,
- enum samsung_timer_mode source)
-{
- s3c_device_timer[event].dev.bus = &platform_bus_type;
- s3c_device_timer[source].dev.bus = &platform_bus_type;
-
- timer_source.event_id = event;
- timer_source.source_id = source;
-}
-
-static struct clock_event_device time_event_device = {
- .name = "samsung_event_timer",
- .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
- .rating = 200,
- .set_next_event = samsung_set_next_event,
- .set_mode = samsung_set_mode,
-};
-
-static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)
-{
- struct clock_event_device *evt = dev_id;
-
- evt->event_handler(evt);
-
- return IRQ_HANDLED;
-}
-
-static struct irqaction samsung_clock_event_irq = {
- .name = "samsung_time_irq",
- .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
- .handler = samsung_clock_event_isr,
- .dev_id = &time_event_device,
-};
-
-static void __init samsung_clockevent_init(void)
-{
- unsigned long pclk;
- unsigned long clock_rate;
- unsigned int irq_number;
- struct clk *tscaler;
-
- pclk = clk_get_rate(timerclk);
-
- tscaler = clk_get_parent(tdiv_event);
-
- clk_set_rate(tscaler, pclk / TSCALER_DIV);
- clk_set_rate(tdiv_event, pclk / TDIV);
- clk_set_parent(tin_event, tdiv_event);
-
- clock_rate = clk_get_rate(tin_event);
- clock_count_per_tick = clock_rate / HZ;
-
- time_event_device.cpumask = cpumask_of(0);
- clockevents_config_and_register(&time_event_device, clock_rate, 1, -1);
-
- irq_number = timer_source.event_id + IRQ_TIMER0;
- setup_irq(irq_number, &samsung_clock_event_irq);
-}
-
-static void __iomem *samsung_timer_reg(void)
-{
- unsigned long offset = 0;
-
- switch (timer_source.source_id) {
- case SAMSUNG_PWM0:
- case SAMSUNG_PWM1:
- case SAMSUNG_PWM2:
- case SAMSUNG_PWM3:
- offset = (timer_source.source_id * 0x0c) + 0x14;
- break;
-
- case SAMSUNG_PWM4:
- offset = 0x40;
- break;
-
- default:
- printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id);
- return NULL;
- }
-
- return S3C_TIMERREG(offset);
-}
-
-/*
- * Override the global weak sched_clock symbol with this
- * local implementation which uses the clocksource to get some
- * better resolution when scheduling the kernel. We accept that
- * this wraps around for now, since it is just a relative time
- * stamp. (Inspired by U300 implementation.)
- */
-static u32 notrace samsung_read_sched_clock(void)
-{
- void __iomem *reg = samsung_timer_reg();
-
- if (!reg)
- return 0;
-
- return ~__raw_readl(reg);
-}
-
-static void __init samsung_clocksource_init(void)
-{
- unsigned long pclk;
- unsigned long clock_rate;
-
- pclk = clk_get_rate(timerclk);
-
- clk_set_rate(tdiv_source, pclk / TDIV);
- clk_set_parent(tin_source, tdiv_source);
-
- clock_rate = clk_get_rate(tin_source);
-
- samsung_time_setup(timer_source.source_id, TCNT_MAX);
- samsung_time_start(timer_source.source_id, PERIODIC);
-
- setup_sched_clock(samsung_read_sched_clock, TSIZE, clock_rate);
-
- if (clocksource_mmio_init(samsung_timer_reg(), "samsung_clocksource_timer",
- clock_rate, 250, TSIZE, clocksource_mmio_readl_down))
- panic("samsung_clocksource_timer: can't register clocksource\n");
-}
-
-static void __init samsung_timer_resources(void)
-{
-
- unsigned long event_id = timer_source.event_id;
- unsigned long source_id = timer_source.source_id;
- char devname[15];
-
- timerclk = clk_get(NULL, "timers");
- if (IS_ERR(timerclk))
- panic("failed to get timers clock for timer");
-
- clk_enable(timerclk);
-
- sprintf(devname, "s3c24xx-pwm.%lu", event_id);
- s3c_device_timer[event_id].id = event_id;
- s3c_device_timer[event_id].dev.init_name = devname;
-
- tin_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tin");
- if (IS_ERR(tin_event))
- panic("failed to get pwm-tin clock for event timer");
-
- tdiv_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tdiv");
- if (IS_ERR(tdiv_event))
- panic("failed to get pwm-tdiv clock for event timer");
-
- clk_enable(tin_event);
-
- sprintf(devname, "s3c24xx-pwm.%lu", source_id);
- s3c_device_timer[source_id].id = source_id;
- s3c_device_timer[source_id].dev.init_name = devname;
-
- tin_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tin");
- if (IS_ERR(tin_source))
- panic("failed to get pwm-tin clock for source timer");
-
- tdiv_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tdiv");
- if (IS_ERR(tdiv_source))
- panic("failed to get pwm-tdiv clock for source timer");
-
- clk_enable(tin_source);
-}
-
-void __init samsung_timer_init(void)
-{
- samsung_timer_resources();
- samsung_clockevent_init();
- samsung_clocksource_init();
-}
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index a32b7a9..89e4c76 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -25,6 +25,13 @@ config DW_APB_TIMER_OF
config ARMADA_370_XP_TIMER
bool
+config SAMSUNG_HRT
+ bool
+ depends on PLAT_SAMSUNG
+ select SAMSUNG_DEV_PWM
+ help
+ Use the high resolution timer support on Samsung platforms.
+
config SUNXI_TIMER
bool
diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index a33f792..d61ba40 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_CLKSRC_NOMADIK_MTU) += nomadik-mtu.o
obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o
obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o
obj-$(CONFIG_ARCH_BCM2835) += bcm2835_timer.o
+obj-$(CONFIG_SAMSUNG_HRT) += samsung-time.o
obj-$(CONFIG_SUNXI_TIMER) += sunxi_timer.o
obj-$(CONFIG_CLKSRC_ARM_GENERIC) += arm_generic.o
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
new file mode 100644
index 0000000..f899cbc
--- /dev/null
+++ b/drivers/clocksource/samsung-time.c
@@ -0,0 +1,394 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * samsung - Common hr-timer support (s3c and s5p)
+ *
+ * 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/interrupt.h>
+#include <linux/irq.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/platform_device.h>
+
+#include <asm/smp_twd.h>
+#include <asm/mach/time.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/sched_clock.h>
+
+#include <mach/map.h>
+#include <plat/devs.h>
+#include <plat/regs-timer.h>
+#include <plat/samsung-time.h>
+
+static struct clk *tin_event;
+static struct clk *tin_source;
+static struct clk *tdiv_event;
+static struct clk *tdiv_source;
+static struct clk *timerclk;
+static struct samsung_timer_source timer_source;
+static unsigned long clock_count_per_tick;
+static void samsung_timer_resume(void);
+
+static void samsung_time_stop(enum samsung_timer_mode mode)
+{
+ unsigned long tcon;
+
+ tcon = __raw_readl(S3C2410_TCON);
+
+ switch (mode) {
+ case SAMSUNG_PWM0:
+ tcon &= ~S3C2410_TCON_T0START;
+ break;
+
+ case SAMSUNG_PWM1:
+ tcon &= ~S3C2410_TCON_T1START;
+ break;
+
+ case SAMSUNG_PWM2:
+ tcon &= ~S3C2410_TCON_T2START;
+ break;
+
+ case SAMSUNG_PWM3:
+ tcon &= ~S3C2410_TCON_T3START;
+ break;
+
+ case SAMSUNG_PWM4:
+ tcon &= ~S3C2410_TCON_T4START;
+ break;
+
+ default:
+ printk(KERN_ERR "Invalid Timer %d\n", mode);
+ break;
+ }
+ __raw_writel(tcon, S3C2410_TCON);
+}
+
+static void samsung_time_setup(enum samsung_timer_mode mode, unsigned long tcnt)
+{
+ unsigned long tcon;
+
+ tcon = __raw_readl(S3C2410_TCON);
+
+ tcnt--;
+
+ switch (mode) {
+ case SAMSUNG_PWM0:
+ tcon &= ~(0x0f << 0);
+ tcon |= S3C2410_TCON_T0MANUALUPD;
+ break;
+
+ case SAMSUNG_PWM1:
+ tcon &= ~(0x0f << 8);
+ tcon |= S3C2410_TCON_T1MANUALUPD;
+ break;
+
+ case SAMSUNG_PWM2:
+ tcon &= ~(0x0f << 12);
+ tcon |= S3C2410_TCON_T2MANUALUPD;
+ break;
+
+ case SAMSUNG_PWM3:
+ tcon &= ~(0x0f << 16);
+ tcon |= S3C2410_TCON_T3MANUALUPD;
+ break;
+
+ case SAMSUNG_PWM4:
+ tcon &= ~(0x07 << 20);
+ tcon |= S3C2410_TCON_T4MANUALUPD;
+ break;
+
+ default:
+ printk(KERN_ERR "Invalid Timer %d\n", mode);
+ break;
+ }
+
+ __raw_writel(tcnt, S3C2410_TCNTB(mode));
+ __raw_writel(tcnt, S3C2410_TCMPB(mode));
+ __raw_writel(tcon, S3C2410_TCON);
+}
+
+static void samsung_time_start(enum samsung_timer_mode mode, bool periodic)
+{
+ unsigned long tcon;
+
+ tcon = __raw_readl(S3C2410_TCON);
+
+ switch (mode) {
+ case SAMSUNG_PWM0:
+ tcon |= S3C2410_TCON_T0START;
+ tcon &= ~S3C2410_TCON_T0MANUALUPD;
+
+ if (periodic)
+ tcon |= S3C2410_TCON_T0RELOAD;
+ else
+ tcon &= ~S3C2410_TCON_T0RELOAD;
+ break;
+
+ case SAMSUNG_PWM1:
+ tcon |= S3C2410_TCON_T1START;
+ tcon &= ~S3C2410_TCON_T1MANUALUPD;
+
+ if (periodic)
+ tcon |= S3C2410_TCON_T1RELOAD;
+ else
+ tcon &= ~S3C2410_TCON_T1RELOAD;
+ break;
+
+ case SAMSUNG_PWM2:
+ tcon |= S3C2410_TCON_T2START;
+ tcon &= ~S3C2410_TCON_T2MANUALUPD;
+
+ if (periodic)
+ tcon |= S3C2410_TCON_T2RELOAD;
+ else
+ tcon &= ~S3C2410_TCON_T2RELOAD;
+ break;
+
+ case SAMSUNG_PWM3:
+ tcon |= S3C2410_TCON_T3START;
+ tcon &= ~S3C2410_TCON_T3MANUALUPD;
+
+ if (periodic)
+ tcon |= S3C2410_TCON_T3RELOAD;
+ else
+ tcon &= ~S3C2410_TCON_T3RELOAD;
+ break;
+
+ case SAMSUNG_PWM4:
+ tcon |= S3C2410_TCON_T4START;
+ tcon &= ~S3C2410_TCON_T4MANUALUPD;
+
+ if (periodic)
+ tcon |= S3C2410_TCON_T4RELOAD;
+ else
+ tcon &= ~S3C2410_TCON_T4RELOAD;
+ break;
+
+ default:
+ printk(KERN_ERR "Invalid Timer %d\n", mode);
+ break;
+ }
+ __raw_writel(tcon, S3C2410_TCON);
+}
+
+static int samsung_set_next_event(unsigned long cycles,
+ struct clock_event_device *evt)
+{
+ samsung_time_setup(timer_source.event_id, cycles);
+ samsung_time_start(timer_source.event_id, NON_PERIODIC);
+
+ return 0;
+}
+
+static void samsung_set_mode(enum clock_event_mode mode,
+ struct clock_event_device *evt)
+{
+ samsung_time_stop(timer_source.event_id);
+
+ switch (mode) {
+ case CLOCK_EVT_MODE_PERIODIC:
+ samsung_time_setup(timer_source.event_id, clock_count_per_tick);
+ samsung_time_start(timer_source.event_id, PERIODIC);
+ break;
+
+ case CLOCK_EVT_MODE_ONESHOT:
+ break;
+
+ case CLOCK_EVT_MODE_UNUSED:
+ case CLOCK_EVT_MODE_SHUTDOWN:
+ break;
+
+ case CLOCK_EVT_MODE_RESUME:
+ samsung_timer_resume();
+ break;
+ }
+}
+
+static void samsung_timer_resume(void)
+{
+ /* event timer restart */
+ samsung_time_setup(timer_source.event_id, clock_count_per_tick);
+ samsung_time_start(timer_source.event_id, PERIODIC);
+
+ /* source timer restart */
+ samsung_time_setup(timer_source.source_id, TCNT_MAX);
+ samsung_time_start(timer_source.source_id, PERIODIC);
+}
+
+void __init samsung_set_timer_source(enum samsung_timer_mode event,
+ enum samsung_timer_mode source)
+{
+ s3c_device_timer[event].dev.bus = &platform_bus_type;
+ s3c_device_timer[source].dev.bus = &platform_bus_type;
+
+ timer_source.event_id = event;
+ timer_source.source_id = source;
+}
+
+static struct clock_event_device time_event_device = {
+ .name = "samsung_event_timer",
+ .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+ .rating = 200,
+ .set_next_event = samsung_set_next_event,
+ .set_mode = samsung_set_mode,
+};
+
+static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)
+{
+ struct clock_event_device *evt = dev_id;
+
+ evt->event_handler(evt);
+
+ return IRQ_HANDLED;
+}
+
+static struct irqaction samsung_clock_event_irq = {
+ .name = "samsung_time_irq",
+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+ .handler = samsung_clock_event_isr,
+ .dev_id = &time_event_device,
+};
+
+static void __init samsung_clockevent_init(void)
+{
+ unsigned long pclk;
+ unsigned long clock_rate;
+ unsigned int irq_number;
+ struct clk *tscaler;
+
+ pclk = clk_get_rate(timerclk);
+
+ tscaler = clk_get_parent(tdiv_event);
+
+ clk_set_rate(tscaler, pclk / TSCALER_DIV);
+ clk_set_rate(tdiv_event, pclk / TDIV);
+ clk_set_parent(tin_event, tdiv_event);
+
+ clock_rate = clk_get_rate(tin_event);
+ clock_count_per_tick = clock_rate / HZ;
+
+ time_event_device.cpumask = cpumask_of(0);
+ clockevents_config_and_register(&time_event_device, clock_rate, 1, -1);
+
+ irq_number = timer_source.event_id + IRQ_TIMER0;
+ setup_irq(irq_number, &samsung_clock_event_irq);
+}
+
+static void __iomem *samsung_timer_reg(void)
+{
+ unsigned long offset = 0;
+
+ switch (timer_source.source_id) {
+ case SAMSUNG_PWM0:
+ case SAMSUNG_PWM1:
+ case SAMSUNG_PWM2:
+ case SAMSUNG_PWM3:
+ offset = (timer_source.source_id * 0x0c) + 0x14;
+ break;
+
+ case SAMSUNG_PWM4:
+ offset = 0x40;
+ break;
+
+ default:
+ printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id);
+ return NULL;
+ }
+
+ return S3C_TIMERREG(offset);
+}
+
+/*
+ * Override the global weak sched_clock symbol with this
+ * local implementation which uses the clocksource to get some
+ * better resolution when scheduling the kernel. We accept that
+ * this wraps around for now, since it is just a relative time
+ * stamp. (Inspired by U300 implementation.)
+ */
+static u32 notrace samsung_read_sched_clock(void)
+{
+ void __iomem *reg = samsung_timer_reg();
+
+ if (!reg)
+ return 0;
+
+ return ~__raw_readl(reg);
+}
+
+static void __init samsung_clocksource_init(void)
+{
+ unsigned long pclk;
+ unsigned long clock_rate;
+
+ pclk = clk_get_rate(timerclk);
+
+ clk_set_rate(tdiv_source, pclk / TDIV);
+ clk_set_parent(tin_source, tdiv_source);
+
+ clock_rate = clk_get_rate(tin_source);
+
+ samsung_time_setup(timer_source.source_id, TCNT_MAX);
+ samsung_time_start(timer_source.source_id, PERIODIC);
+
+ setup_sched_clock(samsung_read_sched_clock, TSIZE, clock_rate);
+
+ if (clocksource_mmio_init(samsung_timer_reg(), "samsung_clocksource_timer",
+ clock_rate, 250, TSIZE, clocksource_mmio_readl_down))
+ panic("samsung_clocksource_timer: can't register clocksource\n");
+}
+
+static void __init samsung_timer_resources(void)
+{
+
+ unsigned long event_id = timer_source.event_id;
+ unsigned long source_id = timer_source.source_id;
+ char devname[15];
+
+ timerclk = clk_get(NULL, "timers");
+ if (IS_ERR(timerclk))
+ panic("failed to get timers clock for timer");
+
+ clk_enable(timerclk);
+
+ sprintf(devname, "s3c24xx-pwm.%lu", event_id);
+ s3c_device_timer[event_id].id = event_id;
+ s3c_device_timer[event_id].dev.init_name = devname;
+
+ tin_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tin");
+ if (IS_ERR(tin_event))
+ panic("failed to get pwm-tin clock for event timer");
+
+ tdiv_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tdiv");
+ if (IS_ERR(tdiv_event))
+ panic("failed to get pwm-tdiv clock for event timer");
+
+ clk_enable(tin_event);
+
+ sprintf(devname, "s3c24xx-pwm.%lu", source_id);
+ s3c_device_timer[source_id].id = source_id;
+ s3c_device_timer[source_id].dev.init_name = devname;
+
+ tin_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tin");
+ if (IS_ERR(tin_source))
+ panic("failed to get pwm-tin clock for source timer");
+
+ tdiv_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tdiv");
+ if (IS_ERR(tdiv_source))
+ panic("failed to get pwm-tdiv clock for source timer");
+
+ clk_enable(tin_source);
+}
+
+void __init samsung_timer_init(void)
+{
+ samsung_timer_resources();
+ samsung_clockevent_init();
+ samsung_clocksource_init();
+}
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 02/12] clocksource: samsung-time: Set platform-specific parameters at runtime
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
2013-02-10 13:20 ` [PATCH 01/12] ARM: SAMSUNG: Move samsung-time to drivers/clocksource Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 03/12] clocksource: samsung-time: Drop useless defines from public header Tomasz Figa
` (10 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch removes static platform-specific defines from samsung-time
implementation and introduces an interface to configure
platform-specific timer parameters from platform code.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/mach-exynos/mach-universal_c210.c | 7 ++++
arch/arm/mach-s3c24xx/common.c | 9 +++++
arch/arm/mach-s3c64xx/common.c | 9 +++++
arch/arm/mach-s5p64x0/common.c | 9 +++++
arch/arm/mach-s5pc100/common.c | 9 +++++
arch/arm/mach-s5pv210/common.c | 9 +++++
arch/arm/plat-samsung/include/plat/samsung-time.h | 20 +++++-------
drivers/clocksource/samsung-time.c | 40 ++++++++++++++++++-----
8 files changed, 92 insertions(+), 20 deletions(-)
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 36e8d4c..5a8c0e1 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1090,11 +1090,18 @@ static struct platform_device *universal_devices[] __initdata = {
&s5p_device_fimc_md,
};
+static const struct samsung_timer_variant universal_timer_variant = {
+ .bits = 32,
+ .prescale = 2,
+ .divisor = 2,
+};
+
static void __init universal_map_io(void)
{
exynos_init_io(NULL, 0);
s3c24xx_init_clocks(clk_xusbxti.rate);
s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
+ samsung_timer_set_variant(&universal_timer_variant);
samsung_set_timer_source(SAMSUNG_PWM2, SAMSUNG_PWM4);
}
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index 6bcf87f..f720053 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -54,6 +54,7 @@
#include <plat/s3c2443.h>
#include <plat/cpu-freq.h>
#include <plat/pll.h>
+#include <plat/samsung-time.h>
/* table of supported CPUs */
@@ -219,6 +220,12 @@ static void s3c24xx_default_idle(void)
S3C2410_CLKCON);
}
+static const struct samsung_timer_variant s3c24xx_timer_variant = {
+ .bits = 16,
+ .prescale = 25,
+ .divisor = 50,
+};
+
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
{
arm_pm_idle = s3c24xx_default_idle;
@@ -235,6 +242,8 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
s3c24xx_init_cpu();
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
+
+ samsung_timer_set_variant(&s3c24xx_timer_variant);
}
/* Serial port registrations */
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index aef303b..5e5fbe5 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -44,6 +44,7 @@
#include <plat/irq-vic-timer.h>
#include <plat/regs-irqtype.h>
#include <plat/regs-serial.h>
+#include <plat/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
@@ -148,6 +149,12 @@ static struct device s3c64xx_dev = {
.bus = &s3c64xx_subsys,
};
+static const struct samsung_timer_variant s3c64xx_timer_variant = {
+ .bits = 32,
+ .prescale = 2,
+ .divisor = 2,
+};
+
/* read cpu identification code */
void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
@@ -160,6 +167,8 @@ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
s3c64xx_init_cpu();
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
+
+ samsung_timer_set_variant(&s3c64xx_timer_variant);
}
static __init int s3c64xx_dev_init(void)
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index 8ae5800..dd93674 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -48,6 +48,7 @@
#include <plat/gpio-cfg.h>
#include <plat/regs-irqtype.h>
#include <plat/regs-serial.h>
+#include <plat/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
@@ -156,6 +157,12 @@ static void s5p64x0_idle(void)
cpu_do_idle();
}
+static const struct samsung_timer_variant s5p64x0_timer_variant = {
+ .bits = 32,
+ .prescale = 2,
+ .divisor = 2,
+};
+
/*
* s5p64x0_map_io
*
@@ -173,6 +180,8 @@ void __init s5p64x0_init_io(struct map_desc *mach_desc, int size)
s5p_init_cpu(S5P64X0_SYS_ID);
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
+
+ samsung_timer_set_variant(&s5p64x0_timer_variant);
}
void __init s5p6440_map_io(void)
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index cc6e561..f3f3a75 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -47,6 +47,7 @@
#include <plat/onenand-core.h>
#include <plat/spi-core.h>
#include <plat/regs-serial.h>
+#include <plat/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
@@ -131,6 +132,12 @@ static struct map_desc s5pc100_iodesc[] __initdata = {
}
};
+static const struct samsung_timer_variant s5pc100_timer_variant = {
+ .bits = 32,
+ .prescale = 2,
+ .divisor = 2,
+};
+
/*
* s5pc100_map_io
*
@@ -148,6 +155,8 @@ void __init s5pc100_init_io(struct map_desc *mach_desc, int size)
s5p_init_cpu(S5P_VA_CHIPID);
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
+
+ samsung_timer_set_variant(&s5pc100_timer_variant);
}
void __init s5pc100_map_io(void)
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 9dfe93e..45acaf3 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -42,6 +42,7 @@
#include <plat/fimc-core.h>
#include <plat/iic-core.h>
#include <plat/keypad-core.h>
+#include <plat/samsung-time.h>
#include <plat/tv-core.h>
#include <plat/spi-core.h>
#include <plat/regs-serial.h>
@@ -148,6 +149,12 @@ void s5pv210_restart(char mode, const char *cmd)
__raw_writel(0x1, S5P_SWRESET);
}
+static const struct samsung_timer_variant s5pv210_timer_variant = {
+ .bits = 32,
+ .prescale = 2,
+ .divisor = 2,
+};
+
/*
* s5pv210_map_io
*
@@ -165,6 +172,8 @@ void __init s5pv210_init_io(struct map_desc *mach_desc, int size)
s5p_init_cpu(S5P_VA_CHIPID);
s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
+
+ samsung_timer_set_variant(&s5pv210_timer_variant);
}
void __init s5pv210_map_io(void)
diff --git a/arch/arm/plat-samsung/include/plat/samsung-time.h b/arch/arm/plat-samsung/include/plat/samsung-time.h
index 6f83a9d..ba7246e 100644
--- a/arch/arm/plat-samsung/include/plat/samsung-time.h
+++ b/arch/arm/plat-samsung/include/plat/samsung-time.h
@@ -27,25 +27,21 @@ struct samsung_timer_source {
unsigned int source_id;
};
+struct samsung_timer_variant {
+ int bits;
+ u16 prescale;
+ u16 divisor;
+};
+
/* Be able to sleep for atleast 4 seconds (usually more) */
#define SAMSUNG_TIMER_MIN_RANGE 4
-#if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S5PC100)
-#define TCNT_MAX 0xffff
-#define TSCALER_DIV 25
-#define TDIV 50
-#define TSIZE 16
-#else
-#define TCNT_MAX 0xffffffff
-#define TSCALER_DIV 2
-#define TDIV 2
-#define TSIZE 32
-#endif
-
#define NON_PERIODIC 0
#define PERIODIC 1
extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
enum samsung_timer_mode source);
+extern void __init samsung_timer_set_variant(
+ const struct samsung_timer_variant *variant);
extern void samsung_timer_init(void);
#endif /* __ASM_PLAT_SAMSUNG_TIME_H */
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index f899cbc..3017203 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -33,6 +33,7 @@ static struct clk *tdiv_event;
static struct clk *tdiv_source;
static struct clk *timerclk;
static struct samsung_timer_source timer_source;
+static struct samsung_timer_variant timer_variant;
static unsigned long clock_count_per_tick;
static void samsung_timer_resume(void);
@@ -213,12 +214,16 @@ static void samsung_set_mode(enum clock_event_mode mode,
static void samsung_timer_resume(void)
{
+ u32 tcnt_max;
+
+ tcnt_max = (1UL << timer_variant.bits) - 1;
+
/* event timer restart */
samsung_time_setup(timer_source.event_id, clock_count_per_tick);
samsung_time_start(timer_source.event_id, PERIODIC);
/* source timer restart */
- samsung_time_setup(timer_source.source_id, TCNT_MAX);
+ samsung_time_setup(timer_source.source_id, tcnt_max);
samsung_time_start(timer_source.source_id, PERIODIC);
}
@@ -232,6 +237,12 @@ void __init samsung_set_timer_source(enum samsung_timer_mode event,
timer_source.source_id = source;
}
+void __init samsung_timer_set_variant(
+ const struct samsung_timer_variant *variant)
+{
+ timer_variant = *variant;
+}
+
static struct clock_event_device time_event_device = {
.name = "samsung_event_timer",
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
@@ -267,8 +278,8 @@ static void __init samsung_clockevent_init(void)
tscaler = clk_get_parent(tdiv_event);
- clk_set_rate(tscaler, pclk / TSCALER_DIV);
- clk_set_rate(tdiv_event, pclk / TDIV);
+ clk_set_rate(tscaler, pclk / timer_variant.prescale);
+ clk_set_rate(tdiv_event, pclk / timer_variant.divisor);
clk_set_parent(tin_event, tdiv_event);
clock_rate = clk_get_rate(tin_event);
@@ -326,21 +337,28 @@ static void __init samsung_clocksource_init(void)
{
unsigned long pclk;
unsigned long clock_rate;
+ u32 tcnt_max;
+ int ret;
+
+ tcnt_max = (1UL << timer_variant.bits) - 1;
pclk = clk_get_rate(timerclk);
- clk_set_rate(tdiv_source, pclk / TDIV);
+ clk_set_rate(tdiv_source, pclk / timer_variant.divisor);
clk_set_parent(tin_source, tdiv_source);
clock_rate = clk_get_rate(tin_source);
- samsung_time_setup(timer_source.source_id, TCNT_MAX);
+ samsung_time_setup(timer_source.source_id, tcnt_max);
samsung_time_start(timer_source.source_id, PERIODIC);
- setup_sched_clock(samsung_read_sched_clock, TSIZE, clock_rate);
+ setup_sched_clock(samsung_read_sched_clock,
+ timer_variant.bits, clock_rate);
- if (clocksource_mmio_init(samsung_timer_reg(), "samsung_clocksource_timer",
- clock_rate, 250, TSIZE, clocksource_mmio_readl_down))
+ ret = clocksource_mmio_init(samsung_timer_reg(),
+ "samsung_clocksource_timer", clock_rate, 250,
+ timer_variant.bits, clocksource_mmio_readl_down);
+ if (ret)
panic("samsung_clocksource_timer: can't register clocksource\n");
}
@@ -388,6 +406,12 @@ static void __init samsung_timer_resources(void)
void __init samsung_timer_init(void)
{
+ if (!timer_source.source_id && !timer_source.event_id)
+ panic("timer sources not set (see samsung_set_timer_source)!\n");
+
+ if (!timer_variant.bits)
+ panic("timer variant not set (see samsung_timer_set_variant)!\n");
+
samsung_timer_resources();
samsung_clockevent_init();
samsung_clocksource_init();
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 03/12] clocksource: samsung-time: Drop useless defines from public header
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
2013-02-10 13:20 ` [PATCH 01/12] ARM: SAMSUNG: Move samsung-time to drivers/clocksource Tomasz Figa
2013-02-10 13:20 ` [PATCH 02/12] clocksource: samsung-time: Set platform-specific parameters at runtime Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 04/12] clocksource: samsung-time: Move samsung-time.h header to include/linux Tomasz Figa
` (9 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch cleans up public header from useless definitions.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/plat-samsung/include/plat/samsung-time.h | 6 ------
drivers/clocksource/samsung-time.c | 10 +++++-----
2 files changed, 5 insertions(+), 11 deletions(-)
diff --git a/arch/arm/plat-samsung/include/plat/samsung-time.h b/arch/arm/plat-samsung/include/plat/samsung-time.h
index ba7246e..68432af 100644
--- a/arch/arm/plat-samsung/include/plat/samsung-time.h
+++ b/arch/arm/plat-samsung/include/plat/samsung-time.h
@@ -33,12 +33,6 @@ struct samsung_timer_variant {
u16 divisor;
};
-/* Be able to sleep for atleast 4 seconds (usually more) */
-#define SAMSUNG_TIMER_MIN_RANGE 4
-
-#define NON_PERIODIC 0
-#define PERIODIC 1
-
extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
enum samsung_timer_mode source);
extern void __init samsung_timer_set_variant(
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 3017203..a6af801 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -183,7 +183,7 @@ static int samsung_set_next_event(unsigned long cycles,
struct clock_event_device *evt)
{
samsung_time_setup(timer_source.event_id, cycles);
- samsung_time_start(timer_source.event_id, NON_PERIODIC);
+ samsung_time_start(timer_source.event_id, false);
return 0;
}
@@ -196,7 +196,7 @@ static void samsung_set_mode(enum clock_event_mode mode,
switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
samsung_time_setup(timer_source.event_id, clock_count_per_tick);
- samsung_time_start(timer_source.event_id, PERIODIC);
+ samsung_time_start(timer_source.event_id, true);
break;
case CLOCK_EVT_MODE_ONESHOT:
@@ -220,11 +220,11 @@ static void samsung_timer_resume(void)
/* event timer restart */
samsung_time_setup(timer_source.event_id, clock_count_per_tick);
- samsung_time_start(timer_source.event_id, PERIODIC);
+ samsung_time_start(timer_source.event_id, true);
/* source timer restart */
samsung_time_setup(timer_source.source_id, tcnt_max);
- samsung_time_start(timer_source.source_id, PERIODIC);
+ samsung_time_start(timer_source.source_id, true);
}
void __init samsung_set_timer_source(enum samsung_timer_mode event,
@@ -350,7 +350,7 @@ static void __init samsung_clocksource_init(void)
clock_rate = clk_get_rate(tin_source);
samsung_time_setup(timer_source.source_id, tcnt_max);
- samsung_time_start(timer_source.source_id, PERIODIC);
+ samsung_time_start(timer_source.source_id, true);
setup_sched_clock(samsung_read_sched_clock,
timer_variant.bits, clock_rate);
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 04/12] clocksource: samsung-time: Move samsung-time.h header to include/linux
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (2 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 03/12] clocksource: samsung-time: Drop useless defines from public header Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-11 10:36 ` Mark Rutland
2013-02-10 13:20 ` [PATCH 05/12] clocksource: samsung-time: Use local register definitions Tomasz Figa
` (8 subsequent siblings)
12 siblings, 1 reply; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch moves the samsung-time.h header file to include/linux
directory and fixes all references to it.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/mach-exynos/mach-universal_c210.c | 2 +-
arch/arm/mach-s3c24xx/common.c | 2 +-
arch/arm/mach-s3c24xx/mach-amlm5900.c | 2 +-
arch/arm/mach-s3c24xx/mach-anubis.c | 2 +-
arch/arm/mach-s3c24xx/mach-at2440evb.c | 2 +-
arch/arm/mach-s3c24xx/mach-bast.c | 2 +-
arch/arm/mach-s3c24xx/mach-gta02.c | 2 +-
arch/arm/mach-s3c24xx/mach-h1940.c | 2 +-
arch/arm/mach-s3c24xx/mach-jive.c | 2 +-
arch/arm/mach-s3c24xx/mach-mini2440.c | 2 +-
arch/arm/mach-s3c24xx/mach-n30.c | 2 +-
arch/arm/mach-s3c24xx/mach-nexcoder.c | 2 +-
arch/arm/mach-s3c24xx/mach-osiris.c | 2 +-
arch/arm/mach-s3c24xx/mach-otom.c | 2 +-
arch/arm/mach-s3c24xx/mach-qt2410.c | 2 +-
arch/arm/mach-s3c24xx/mach-rx1950.c | 2 +-
arch/arm/mach-s3c24xx/mach-rx3715.c | 2 +-
arch/arm/mach-s3c24xx/mach-smdk2410.c | 2 +-
arch/arm/mach-s3c24xx/mach-smdk2413.c | 2 +-
arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +-
arch/arm/mach-s3c24xx/mach-smdk2440.c | 2 +-
arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +-
arch/arm/mach-s3c24xx/mach-tct_hammer.c | 2 +-
arch/arm/mach-s3c24xx/mach-vr1000.c | 2 +-
arch/arm/mach-s3c24xx/mach-vstms.c | 2 +-
arch/arm/mach-s3c64xx/common.c | 2 +-
arch/arm/mach-s3c64xx/mach-anw6410.c | 2 +-
arch/arm/mach-s3c64xx/mach-crag6410.c | 2 +-
arch/arm/mach-s3c64xx/mach-hmt.c | 2 +-
arch/arm/mach-s3c64xx/mach-mini6410.c | 2 +-
arch/arm/mach-s3c64xx/mach-ncp.c | 2 +-
arch/arm/mach-s3c64xx/mach-real6410.c | 2 +-
arch/arm/mach-s3c64xx/mach-smartq.c | 2 +-
arch/arm/mach-s3c64xx/mach-smartq5.c | 2 +-
arch/arm/mach-s3c64xx/mach-smartq7.c | 2 +-
arch/arm/mach-s3c64xx/mach-smdk6400.c | 2 +-
arch/arm/mach-s3c64xx/mach-smdk6410.c | 2 +-
arch/arm/mach-s5p64x0/common.c | 2 +-
arch/arm/mach-s5p64x0/mach-smdk6440.c | 2 +-
arch/arm/mach-s5p64x0/mach-smdk6450.c | 2 +-
arch/arm/mach-s5pc100/common.c | 2 +-
arch/arm/mach-s5pc100/mach-smdkc100.c | 2 +-
arch/arm/mach-s5pv210/common.c | 2 +-
arch/arm/mach-s5pv210/mach-aquila.c | 2 +-
arch/arm/mach-s5pv210/mach-goni.c | 2 +-
arch/arm/mach-s5pv210/mach-smdkc110.c | 2 +-
arch/arm/mach-s5pv210/mach-smdkv210.c | 2 +-
arch/arm/mach-s5pv210/mach-torbreck.c | 2 +-
arch/arm/plat-samsung/include/plat/samsung-time.h | 41 -----------------------
drivers/clocksource/samsung-time.c | 2 +-
include/linux/samsung-time.h | 41 +++++++++++++++++++++++
51 files changed, 90 insertions(+), 90 deletions(-)
delete mode 100644 arch/arm/plat-samsung/include/plat/samsung-time.h
create mode 100644 include/linux/samsung-time.h
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 5a8c0e1..284b66b 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -42,7 +42,7 @@
#include <plat/mfc.h>
#include <plat/sdhci.h>
#include <plat/fimc-core.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/camport.h>
#include <mach/map.h>
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index f720053..40b3c8f 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -54,7 +54,7 @@
#include <plat/s3c2443.h>
#include <plat/cpu-freq.h>
#include <plat/pll.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
/* table of supported CPUs */
diff --git a/arch/arm/mach-s3c24xx/mach-amlm5900.c b/arch/arm/mach-s3c24xx/mach-amlm5900.c
index 432144c..d48c405 100644
--- a/arch/arm/mach-s3c24xx/mach-amlm5900.c
+++ b/arch/arm/mach-s3c24xx/mach-amlm5900.c
@@ -63,7 +63,7 @@
#include <linux/mtd/map.h>
#include <linux/mtd/physmap.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-anubis.c b/arch/arm/mach-s3c24xx/mach-anubis.c
index 24f1a04..37d1c98 100644
--- a/arch/arm/mach-s3c24xx/mach-anubis.c
+++ b/arch/arm/mach-s3c24xx/mach-anubis.c
@@ -49,7 +49,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <linux/platform_data/asoc-s3c24xx_simtec.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "anubis.h"
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c
index 2bf6c8c..0797671 100644
--- a/arch/arm/mach-s3c24xx/mach-at2440evb.c
+++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c
@@ -48,7 +48,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <linux/platform_data/mmc-s3cmci.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-bast.c b/arch/arm/mach-s3c24xx/mach-bast.c
index eabe2db..15d0ec1 100644
--- a/arch/arm/mach-s3c24xx/mach-bast.c
+++ b/arch/arm/mach-s3c24xx/mach-bast.c
@@ -55,7 +55,7 @@
#include <plat/devs.h>
#include <plat/gpio-cfg.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "bast.h"
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c
index 84a750d..a2959e4 100644
--- a/arch/arm/mach-s3c24xx/mach-gta02.c
+++ b/arch/arm/mach-s3c24xx/mach-gta02.c
@@ -81,7 +81,7 @@
#include <plat/gpio-cfg.h>
#include <plat/pm.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "gta02.h"
diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
index 8dd6601..5c56efd 100644
--- a/arch/arm/mach-s3c24xx/mach-h1940.c
+++ b/arch/arm/mach-s3c24xx/mach-h1940.c
@@ -62,7 +62,7 @@
#include <plat/pll.h>
#include <plat/pm.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "h1940.h"
diff --git a/arch/arm/mach-s3c24xx/mach-jive.c b/arch/arm/mach-s3c24xx/mach-jive.c
index 4096496..dddb320 100644
--- a/arch/arm/mach-s3c24xx/mach-jive.c
+++ b/arch/arm/mach-s3c24xx/mach-jive.c
@@ -53,7 +53,7 @@
#include <plat/cpu.h>
#include <plat/pm.h>
#include <linux/platform_data/usb-s3c2410_udc.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "s3c2412-power.h"
diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c
index 29f106c..7b6add6 100644
--- a/arch/arm/mach-s3c24xx/mach-mini2440.c
+++ b/arch/arm/mach-s3c24xx/mach-mini2440.c
@@ -56,7 +56,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <sound/s3c24xx_uda134x.h>
diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c
index 628b1e3..4f4baf0 100644
--- a/arch/arm/mach-s3c24xx/mach-n30.c
+++ b/arch/arm/mach-s3c24xx/mach-n30.c
@@ -50,7 +50,7 @@
#include <linux/platform_data/mmc-s3cmci.h>
#include <plat/s3c2410.h>
#include <linux/platform_data/usb-s3c2410_udc.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-nexcoder.c b/arch/arm/mach-s3c24xx/mach-nexcoder.c
index f64a146..0b490ab 100644
--- a/arch/arm/mach-s3c24xx/mach-nexcoder.c
+++ b/arch/arm/mach-s3c24xx/mach-nexcoder.c
@@ -46,7 +46,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-osiris.c b/arch/arm/mach-s3c24xx/mach-osiris.c
index ef3a7b0..1236ad7 100644
--- a/arch/arm/mach-s3c24xx/mach-osiris.c
+++ b/arch/arm/mach-s3c24xx/mach-osiris.c
@@ -44,7 +44,7 @@
#include <plat/devs.h>
#include <plat/gpio-cfg.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <mach/hardware.h>
#include <mach/regs-gpio.h>
diff --git a/arch/arm/mach-s3c24xx/mach-otom.c b/arch/arm/mach-s3c24xx/mach-otom.c
index 718cde8..da1b02a 100644
--- a/arch/arm/mach-s3c24xx/mach-otom.c
+++ b/arch/arm/mach-s3c24xx/mach-otom.c
@@ -34,7 +34,7 @@
#include <plat/devs.h>
#include <plat/regs-serial.h>
#include <plat/s3c2410.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "otom.h"
diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c
index c4ac6ea..31a76d4 100644
--- a/arch/arm/mach-s3c24xx/mach-qt2410.c
+++ b/arch/arm/mach-s3c24xx/mach-qt2410.c
@@ -60,7 +60,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/pm.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
index 799af43..23d9a6f 100644
--- a/arch/arm/mach-s3c24xx/mach-rx1950.c
+++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
@@ -58,7 +58,7 @@
#include <plat/pm.h>
#include <plat/regs-iic.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "h1940.h"
diff --git a/arch/arm/mach-s3c24xx/mach-rx3715.c b/arch/arm/mach-s3c24xx/mach-rx3715.c
index 0a3c964..5843424 100644
--- a/arch/arm/mach-s3c24xx/mach-rx3715.c
+++ b/arch/arm/mach-s3c24xx/mach-rx3715.c
@@ -49,7 +49,7 @@
#include <plat/devs.h>
#include <plat/pm.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "h1940.h"
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2410.c b/arch/arm/mach-s3c24xx/mach-smdk2410.c
index dfd051f..183a9c8 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2410.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2410.c
@@ -53,7 +53,7 @@
#include <plat/cpu.h>
#include <plat/common-smdk.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2413.c b/arch/arm/mach-s3c24xx/mach-smdk2413.c
index 960f6d2b..04884cb 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2413.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2413.c
@@ -46,7 +46,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/common-smdk.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2416.c b/arch/arm/mach-s3c24xx/mach-smdk2416.c
index eef720d..08dde09 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2416.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2416.c
@@ -51,7 +51,7 @@
#include <plat/sdhci.h>
#include <linux/platform_data/usb-s3c2410_udc.h>
#include <linux/platform_data/s3c-hsudc.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/fb.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2440.c b/arch/arm/mach-s3c24xx/mach-smdk2440.c
index 05bf045..e3d3fbb 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2440.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2440.c
@@ -43,7 +43,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/common-smdk.h>
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2443.c b/arch/arm/mach-s3c24xx/mach-smdk2443.c
index d9991fb..84ac047 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2443.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2443.c
@@ -43,7 +43,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/common-smdk.h>
diff --git a/arch/arm/mach-s3c24xx/mach-tct_hammer.c b/arch/arm/mach-s3c24xx/mach-tct_hammer.c
index 31dfe58..5d88794 100644
--- a/arch/arm/mach-s3c24xx/mach-tct_hammer.c
+++ b/arch/arm/mach-s3c24xx/mach-tct_hammer.c
@@ -53,7 +53,7 @@
#include <linux/mtd/partitions.h>
#include <linux/mtd/map.h>
#include <linux/mtd/physmap.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-vr1000.c b/arch/arm/mach-s3c24xx/mach-vr1000.c
index deeb8a0..b10f20c 100644
--- a/arch/arm/mach-s3c24xx/mach-vr1000.c
+++ b/arch/arm/mach-s3c24xx/mach-vr1000.c
@@ -45,7 +45,7 @@
#include <plat/cpu.h>
#include <plat/devs.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "bast.h"
#include "common.h"
diff --git a/arch/arm/mach-s3c24xx/mach-vstms.c b/arch/arm/mach-s3c24xx/mach-vstms.c
index dcc0f40..9d31250 100644
--- a/arch/arm/mach-s3c24xx/mach-vstms.c
+++ b/arch/arm/mach-s3c24xx/mach-vstms.c
@@ -46,7 +46,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
static struct map_desc vstms_iodesc[] __initdata = {
};
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index 5e5fbe5..89129e9 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -44,7 +44,7 @@
#include <plat/irq-vic-timer.h>
#include <plat/regs-irqtype.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c
index e62a523..83296ac 100644
--- a/arch/arm/mach-s3c64xx/mach-anw6410.c
+++ b/arch/arm/mach-s3c64xx/mach-anw6410.c
@@ -50,7 +50,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <mach/regs-gpio.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "regs-modem.h"
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c
index e24ba45..3a642d9 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
@@ -65,7 +65,7 @@
#include <plat/adc.h>
#include <linux/platform_data/i2c-s3c2410.h>
#include <plat/pm.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "crag6410.h"
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c
index 721f26d..88809e1 100644
--- a/arch/arm/mach-s3c64xx/mach-hmt.c
+++ b/arch/arm/mach-s3c64xx/mach-hmt.c
@@ -42,7 +42,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c
index b2faf05..0ad716f 100644
--- a/arch/arm/mach-s3c64xx/mach-mini6410.c
+++ b/arch/arm/mach-s3c64xx/mach-mini6410.c
@@ -42,7 +42,7 @@
#include <video/platform_lcd.h>
#include <video/samsung_fimd.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "regs-modem.h"
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c
index 91063d8..b3d1798 100644
--- a/arch/arm/mach-s3c64xx/mach-ncp.c
+++ b/arch/arm/mach-s3c64xx/mach-ncp.c
@@ -44,7 +44,7 @@
#include <plat/clock.h>
#include <plat/devs.h>
#include <plat/cpu.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c
index 2db2316..e10c672 100644
--- a/arch/arm/mach-s3c64xx/mach-real6410.c
+++ b/arch/arm/mach-s3c64xx/mach-real6410.c
@@ -43,7 +43,7 @@
#include <video/platform_lcd.h>
#include <video/samsung_fimd.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "regs-modem.h"
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c
index 58ac990..4bed40a 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq.c
@@ -38,7 +38,7 @@
#include <linux/platform_data/touchscreen-s3c2410.h>
#include <video/platform_lcd.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "regs-modem.h"
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c
index 02717c2..37f1c19 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq5.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq5.c
@@ -29,7 +29,7 @@
#include <plat/devs.h>
#include <plat/fb.h>
#include <plat/gpio-cfg.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "mach-smartq.h"
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c
index 70d975e..bd7131a 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq7.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq7.c
@@ -29,7 +29,7 @@
#include <plat/devs.h>
#include <plat/fb.h>
#include <plat/gpio-cfg.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "mach-smartq.h"
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c
index c91f8c9..6a588e5 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6400.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c
@@ -36,7 +36,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index 5202df9..3657e54 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -70,7 +70,7 @@
#include <linux/platform_data/touchscreen-s3c2410.h>
#include <plat/keypad.h>
#include <plat/backlight.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
#include "regs-modem.h"
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index dd93674..a959d98 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -48,7 +48,7 @@
#include <plat/gpio-cfg.h>
#include <plat/regs-irqtype.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c
index 6cc5453..9b42fd6 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6440.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c
@@ -49,7 +49,7 @@
#include <plat/pll.h>
#include <plat/adc.h>
#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/backlight.h>
#include <plat/fb.h>
#include <plat/sdhci.h>
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c
index 89299f2..544fe11 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6450.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c
@@ -49,7 +49,7 @@
#include <plat/pll.h>
#include <plat/adc.h>
#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/backlight.h>
#include <plat/fb.h>
#include <plat/sdhci.h>
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index f3f3a75..e63ff33 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -47,7 +47,7 @@
#include <plat/onenand-core.h>
#include <plat/spi-core.h>
#include <plat/regs-serial.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/watchdog-reset.h>
#include "common.h"
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c
index 1508f80..bffb83f 100644
--- a/arch/arm/mach-s5pc100/mach-smdkc100.c
+++ b/arch/arm/mach-s5pc100/mach-smdkc100.c
@@ -52,7 +52,7 @@
#include <linux/platform_data/touchscreen-s3c2410.h>
#include <linux/platform_data/asoc-s3c.h>
#include <plat/backlight.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 45acaf3..2ab06ce 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -42,7 +42,7 @@
#include <plat/fimc-core.h>
#include <plat/iic-core.h>
#include <plat/keypad-core.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/tv-core.h>
#include <plat/spi-core.h>
#include <plat/regs-serial.h>
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c
index 7307d18..ec2d1bb 100644
--- a/arch/arm/mach-s5pv210/mach-aquila.c
+++ b/arch/arm/mach-s5pv210/mach-aquila.c
@@ -39,7 +39,7 @@
#include <plat/fb.h>
#include <plat/fimc-core.h>
#include <plat/sdhci.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
index eb6f4fd..b9821a7 100644
--- a/arch/arm/mach-s5pv210/mach-goni.c
+++ b/arch/arm/mach-s5pv210/mach-goni.c
@@ -48,7 +48,7 @@
#include <plat/keypad.h>
#include <plat/sdhci.h>
#include <plat/clock.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/mfc.h>
#include <plat/camport.h>
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c
index 67d33ae..94f4a78 100644
--- a/arch/arm/mach-s5pv210/mach-smdkc110.c
+++ b/arch/arm/mach-s5pv210/mach-smdkc110.c
@@ -30,7 +30,7 @@
#include <linux/platform_data/ata-samsung_cf.h>
#include <linux/platform_data/i2c-s3c2410.h>
#include <plat/pm.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/mfc.h>
#include "common.h"
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c
index 5c8bde1..b427583 100644
--- a/arch/arm/mach-s5pv210/mach-smdkv210.c
+++ b/arch/arm/mach-s5pv210/mach-smdkv210.c
@@ -45,7 +45,7 @@
#include <plat/keypad.h>
#include <plat/pm.h>
#include <plat/fb.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include <plat/backlight.h>
#include <plat/mfc.h>
#include <plat/clock.h>
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c
index 34dd611..84e80f9 100644
--- a/arch/arm/mach-s5pv210/mach-torbreck.c
+++ b/arch/arm/mach-s5pv210/mach-torbreck.c
@@ -27,7 +27,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/samsung-time.h>
+#include <linux/samsung-time.h>
#include "common.h"
diff --git a/arch/arm/plat-samsung/include/plat/samsung-time.h b/arch/arm/plat-samsung/include/plat/samsung-time.h
deleted file mode 100644
index 68432af..0000000
--- a/arch/arm/plat-samsung/include/plat/samsung-time.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* linux/arch/arm/plat-samsung/include/plat/samsung-time.h
- *
- * Copyright 2011 Samsung Electronics Co., Ltd.
- * http://www.samsung.com/
- *
- * Header file for samsung s3c and s5p time support
- *
- * 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.
-*/
-
-#ifndef __ASM_PLAT_SAMSUNG_TIME_H
-#define __ASM_PLAT_SAMSUNG_TIME_H __FILE__
-
-/* SAMSUNG HR-Timer Clock mode */
-enum samsung_timer_mode {
- SAMSUNG_PWM0,
- SAMSUNG_PWM1,
- SAMSUNG_PWM2,
- SAMSUNG_PWM3,
- SAMSUNG_PWM4,
-};
-
-struct samsung_timer_source {
- unsigned int event_id;
- unsigned int source_id;
-};
-
-struct samsung_timer_variant {
- int bits;
- u16 prescale;
- u16 divisor;
-};
-
-extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
- enum samsung_timer_mode source);
-extern void __init samsung_timer_set_variant(
- const struct samsung_timer_variant *variant);
-extern void samsung_timer_init(void);
-#endif /* __ASM_PLAT_SAMSUNG_TIME_H */
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index a6af801..9c0626f 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -15,6 +15,7 @@
#include <linux/clk.h>
#include <linux/clockchips.h>
#include <linux/platform_device.h>
+#include <linux/samsung-time.h>
#include <asm/smp_twd.h>
#include <asm/mach/time.h>
@@ -25,7 +26,6 @@
#include <mach/map.h>
#include <plat/devs.h>
#include <plat/regs-timer.h>
-#include <plat/samsung-time.h>
static struct clk *tin_event;
static struct clk *tin_source;
diff --git a/include/linux/samsung-time.h b/include/linux/samsung-time.h
new file mode 100644
index 0000000..68432af
--- /dev/null
+++ b/include/linux/samsung-time.h
@@ -0,0 +1,41 @@
+/* linux/arch/arm/plat-samsung/include/plat/samsung-time.h
+ *
+ * Copyright 2011 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * Header file for samsung s3c and s5p time support
+ *
+ * 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.
+*/
+
+#ifndef __ASM_PLAT_SAMSUNG_TIME_H
+#define __ASM_PLAT_SAMSUNG_TIME_H __FILE__
+
+/* SAMSUNG HR-Timer Clock mode */
+enum samsung_timer_mode {
+ SAMSUNG_PWM0,
+ SAMSUNG_PWM1,
+ SAMSUNG_PWM2,
+ SAMSUNG_PWM3,
+ SAMSUNG_PWM4,
+};
+
+struct samsung_timer_source {
+ unsigned int event_id;
+ unsigned int source_id;
+};
+
+struct samsung_timer_variant {
+ int bits;
+ u16 prescale;
+ u16 divisor;
+};
+
+extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
+ enum samsung_timer_mode source);
+extern void __init samsung_timer_set_variant(
+ const struct samsung_timer_variant *variant);
+extern void samsung_timer_init(void);
+#endif /* __ASM_PLAT_SAMSUNG_TIME_H */
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 05/12] clocksource: samsung-time: Use local register definitions
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (3 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 04/12] clocksource: samsung-time: Move samsung-time.h header to include/linux Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 06/12] clocksource: samsung-time: Remove use of static register mapping Tomasz Figa
` (7 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch copies PWM timer register definitions to samsung-time.c. The
original header in plat is being kept for now, since it is also used by
other code that also needs to be reworked to be multiplatform-friendly.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
drivers/clocksource/samsung-time.c | 106 ++++++++++++++++++++++++++++++++++++-
1 file changed, 105 insertions(+), 1 deletion(-)
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 9c0626f..985086e 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -25,7 +25,111 @@
#include <mach/map.h>
#include <plat/devs.h>
-#include <plat/regs-timer.h>
+
+#define S3C_TIMERREG(x) (S3C_VA_TIMER + (x))
+#define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c))
+
+#define S3C2410_TCFG0 S3C_TIMERREG(0x00)
+#define S3C2410_TCFG1 S3C_TIMERREG(0x04)
+#define S3C2410_TCON S3C_TIMERREG(0x08)
+
+#define S3C64XX_TINT_CSTAT S3C_TIMERREG(0x44)
+
+#define S3C2410_TCFG_PRESCALER0_MASK (255<<0)
+#define S3C2410_TCFG_PRESCALER1_MASK (255<<8)
+#define S3C2410_TCFG_PRESCALER1_SHIFT (8)
+#define S3C2410_TCFG_DEADZONE_MASK (255<<16)
+#define S3C2410_TCFG_DEADZONE_SHIFT (16)
+
+#define S3C2410_TCFG1_MUX4_DIV2 (0<<16)
+#define S3C2410_TCFG1_MUX4_DIV4 (1<<16)
+#define S3C2410_TCFG1_MUX4_DIV8 (2<<16)
+#define S3C2410_TCFG1_MUX4_DIV16 (3<<16)
+#define S3C2410_TCFG1_MUX4_TCLK1 (4<<16)
+#define S3C2410_TCFG1_MUX4_MASK (15<<16)
+#define S3C2410_TCFG1_MUX4_SHIFT (16)
+
+#define S3C2410_TCFG1_MUX3_DIV2 (0<<12)
+#define S3C2410_TCFG1_MUX3_DIV4 (1<<12)
+#define S3C2410_TCFG1_MUX3_DIV8 (2<<12)
+#define S3C2410_TCFG1_MUX3_DIV16 (3<<12)
+#define S3C2410_TCFG1_MUX3_TCLK1 (4<<12)
+#define S3C2410_TCFG1_MUX3_MASK (15<<12)
+
+
+#define S3C2410_TCFG1_MUX2_DIV2 (0<<8)
+#define S3C2410_TCFG1_MUX2_DIV4 (1<<8)
+#define S3C2410_TCFG1_MUX2_DIV8 (2<<8)
+#define S3C2410_TCFG1_MUX2_DIV16 (3<<8)
+#define S3C2410_TCFG1_MUX2_TCLK1 (4<<8)
+#define S3C2410_TCFG1_MUX2_MASK (15<<8)
+
+
+#define S3C2410_TCFG1_MUX1_DIV2 (0<<4)
+#define S3C2410_TCFG1_MUX1_DIV4 (1<<4)
+#define S3C2410_TCFG1_MUX1_DIV8 (2<<4)
+#define S3C2410_TCFG1_MUX1_DIV16 (3<<4)
+#define S3C2410_TCFG1_MUX1_TCLK0 (4<<4)
+#define S3C2410_TCFG1_MUX1_MASK (15<<4)
+
+#define S3C2410_TCFG1_MUX0_DIV2 (0<<0)
+#define S3C2410_TCFG1_MUX0_DIV4 (1<<0)
+#define S3C2410_TCFG1_MUX0_DIV8 (2<<0)
+#define S3C2410_TCFG1_MUX0_DIV16 (3<<0)
+#define S3C2410_TCFG1_MUX0_TCLK0 (4<<0)
+#define S3C2410_TCFG1_MUX0_MASK (15<<0)
+
+#define S3C2410_TCFG1_MUX_DIV2 (0<<0)
+#define S3C2410_TCFG1_MUX_DIV4 (1<<0)
+#define S3C2410_TCFG1_MUX_DIV8 (2<<0)
+#define S3C2410_TCFG1_MUX_DIV16 (3<<0)
+#define S3C2410_TCFG1_MUX_TCLK (4<<0)
+#define S3C2410_TCFG1_MUX_MASK (15<<0)
+
+#define S3C64XX_TCFG1_MUX_DIV1 (0<<0)
+#define S3C64XX_TCFG1_MUX_DIV2 (1<<0)
+#define S3C64XX_TCFG1_MUX_DIV4 (2<<0)
+#define S3C64XX_TCFG1_MUX_DIV8 (3<<0)
+#define S3C64XX_TCFG1_MUX_DIV16 (4<<0)
+#define S3C64XX_TCFG1_MUX_TCLK (5<<0) /* 3 sets of TCLK */
+#define S3C64XX_TCFG1_MUX_MASK (15<<0)
+
+#define S3C2410_TCFG1_SHIFT(x) ((x) * 4)
+
+/* for each timer, we have an count buffer, an compare buffer and
+ * an observation buffer
+*/
+
+/* WARNING - timer 4 has no buffer reg, and it's observation is@+4 */
+
+#define S3C2410_TCNTB(tmr) S3C_TIMERREG2(tmr, 0x00)
+#define S3C2410_TCMPB(tmr) S3C_TIMERREG2(tmr, 0x04)
+#define S3C2410_TCNTO(tmr) S3C_TIMERREG2(tmr, (((tmr) == 4) ? 0x04 : 0x08))
+
+#define S3C2410_TCON_T4RELOAD (1<<22)
+#define S3C2410_TCON_T4MANUALUPD (1<<21)
+#define S3C2410_TCON_T4START (1<<20)
+
+#define S3C2410_TCON_T3RELOAD (1<<19)
+#define S3C2410_TCON_T3INVERT (1<<18)
+#define S3C2410_TCON_T3MANUALUPD (1<<17)
+#define S3C2410_TCON_T3START (1<<16)
+
+#define S3C2410_TCON_T2RELOAD (1<<15)
+#define S3C2410_TCON_T2INVERT (1<<14)
+#define S3C2410_TCON_T2MANUALUPD (1<<13)
+#define S3C2410_TCON_T2START (1<<12)
+
+#define S3C2410_TCON_T1RELOAD (1<<11)
+#define S3C2410_TCON_T1INVERT (1<<10)
+#define S3C2410_TCON_T1MANUALUPD (1<<9)
+#define S3C2410_TCON_T1START (1<<8)
+
+#define S3C2410_TCON_T0DEADZONE (1<<4)
+#define S3C2410_TCON_T0RELOAD (1<<3)
+#define S3C2410_TCON_T0INVERT (1<<2)
+#define S3C2410_TCON_T0MANUALUPD (1<<1)
+#define S3C2410_TCON_T0START (1<<0)
static struct clk *tin_event;
static struct clk *tin_source;
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 06/12] clocksource: samsung-time: Remove use of static register mapping
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (4 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 05/12] clocksource: samsung-time: Use local register definitions Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 07/12] clocksource: samsung-time: Use clk_get_sys for getting clocks Tomasz Figa
` (6 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch brings the samsung-time driver one step closer to
multiplatform by replacing references to statically mapped registers
with dynamic mapping using ioremap.
The helper struct samsung_timer_variant is extended with reg_base field,
which is used to pass platform-specific base address to the driver.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/mach-exynos/mach-universal_c210.c | 1 +
arch/arm/mach-s3c24xx/common.c | 1 +
arch/arm/mach-s3c64xx/common.c | 1 +
arch/arm/mach-s5p64x0/common.c | 1 +
arch/arm/mach-s5pc100/common.c | 1 +
arch/arm/mach-s5pv210/common.c | 1 +
drivers/clocksource/samsung-time.c | 9 +++++++--
include/linux/samsung-time.h | 1 +
8 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 284b66b..50fe390 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1091,6 +1091,7 @@ static struct platform_device *universal_devices[] __initdata = {
};
static const struct samsung_timer_variant universal_timer_variant = {
+ .reg_base = EXYNOS4_PA_TIMER,
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index 40b3c8f..9a0584e 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -221,6 +221,7 @@ static void s3c24xx_default_idle(void)
}
static const struct samsung_timer_variant s3c24xx_timer_variant = {
+ .reg_base = S3C24XX_PA_TIMER,
.bits = 16,
.prescale = 25,
.divisor = 50,
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index 89129e9..eb36740e 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -150,6 +150,7 @@ static struct device s3c64xx_dev = {
};
static const struct samsung_timer_variant s3c64xx_timer_variant = {
+ .reg_base = S3C_PA_TIMER,
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index a959d98..0158c22 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -158,6 +158,7 @@ static void s5p64x0_idle(void)
}
static const struct samsung_timer_variant s5p64x0_timer_variant = {
+ .reg_base = S5P_PA_TIMER,
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index e63ff33..5ca2f53 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -133,6 +133,7 @@ static struct map_desc s5pc100_iodesc[] __initdata = {
};
static const struct samsung_timer_variant s5pc100_timer_variant = {
+ .reg_base = S5P_PA_TIMER,
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 2ab06ce..c80aa9c 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -150,6 +150,7 @@ void s5pv210_restart(char mode, const char *cmd)
}
static const struct samsung_timer_variant s5pv210_timer_variant = {
+ .reg_base = S5P_PA_TIMER,
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 985086e..d847036 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -23,10 +23,11 @@
#include <asm/mach/map.h>
#include <asm/sched_clock.h>
-#include <mach/map.h>
#include <plat/devs.h>
-#define S3C_TIMERREG(x) (S3C_VA_TIMER + (x))
+static void __iomem *timer_base;
+
+#define S3C_TIMERREG(x) (timer_base + (x))
#define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c))
#define S3C2410_TCFG0 S3C_TIMERREG(0x00)
@@ -473,6 +474,10 @@ static void __init samsung_timer_resources(void)
unsigned long source_id = timer_source.source_id;
char devname[15];
+ timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
+ if (!timer_base)
+ panic("failed to map timer registers");
+
timerclk = clk_get(NULL, "timers");
if (IS_ERR(timerclk))
panic("failed to get timers clock for timer");
diff --git a/include/linux/samsung-time.h b/include/linux/samsung-time.h
index 68432af..526ff99 100644
--- a/include/linux/samsung-time.h
+++ b/include/linux/samsung-time.h
@@ -28,6 +28,7 @@ struct samsung_timer_source {
};
struct samsung_timer_variant {
+ unsigned long reg_base;
int bits;
u16 prescale;
u16 divisor;
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 07/12] clocksource: samsung-time: Use clk_get_sys for getting clocks
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (5 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 06/12] clocksource: samsung-time: Remove use of static register mapping Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 08/12] ARM: SAMSUNG: devs: Drop unnecessary IRQ resources of timer devices Tomasz Figa
` (5 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch removes the need to reference platform_device structs defined
in platform code, by using clk_get_sys instead of clk_get for getting
necessary clocks.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
drivers/clocksource/samsung-time.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index d847036..29fc63f 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -23,8 +23,6 @@
#include <asm/mach/map.h>
#include <asm/sched_clock.h>
-#include <plat/devs.h>
-
static void __iomem *timer_base;
#define S3C_TIMERREG(x) (timer_base + (x))
@@ -335,9 +333,6 @@ static void samsung_timer_resume(void)
void __init samsung_set_timer_source(enum samsung_timer_mode event,
enum samsung_timer_mode source)
{
- s3c_device_timer[event].dev.bus = &platform_bus_type;
- s3c_device_timer[source].dev.bus = &platform_bus_type;
-
timer_source.event_id = event;
timer_source.source_id = source;
}
@@ -485,28 +480,24 @@ static void __init samsung_timer_resources(void)
clk_enable(timerclk);
sprintf(devname, "s3c24xx-pwm.%lu", event_id);
- s3c_device_timer[event_id].id = event_id;
- s3c_device_timer[event_id].dev.init_name = devname;
- tin_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tin");
+ tin_event = clk_get_sys(devname, "pwm-tin");
if (IS_ERR(tin_event))
panic("failed to get pwm-tin clock for event timer");
- tdiv_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tdiv");
+ tdiv_event = clk_get_sys(devname, "pwm-tdiv");
if (IS_ERR(tdiv_event))
panic("failed to get pwm-tdiv clock for event timer");
clk_enable(tin_event);
sprintf(devname, "s3c24xx-pwm.%lu", source_id);
- s3c_device_timer[source_id].id = source_id;
- s3c_device_timer[source_id].dev.init_name = devname;
- tin_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tin");
+ tin_source = clk_get_sys(devname, "pwm-tin");
if (IS_ERR(tin_source))
panic("failed to get pwm-tin clock for source timer");
- tdiv_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tdiv");
+ tdiv_source = clk_get_sys(devname, "pwm-tdiv");
if (IS_ERR(tdiv_source))
panic("failed to get pwm-tdiv clock for source timer");
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 08/12] ARM: SAMSUNG: devs: Drop unnecessary IRQ resources of timer devices
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (6 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 07/12] clocksource: samsung-time: Use clk_get_sys for getting clocks Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 09/12] clocksource: samsung-time: Do not use static IRQ definition Tomasz Figa
` (4 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
Devices from s3c_device_timer array are used only for PWM driver, which
does not need interrupts. This patch removes IRQ resources of those
devices.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/plat-samsung/devs.c | 28 ++++++++--------------------
1 file changed, 8 insertions(+), 20 deletions(-)
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c
index e1124d9..196aa68 100644
--- a/arch/arm/plat-samsung/devs.c
+++ b/arch/arm/plat-samsung/devs.c
@@ -1137,34 +1137,22 @@ arch_initcall(s5p_pmu_init);
#ifdef CONFIG_SAMSUNG_DEV_PWM
-#define TIMER_RESOURCE_SIZE (1)
-
-#define TIMER_RESOURCE(_tmr, _irq) \
- (struct resource [TIMER_RESOURCE_SIZE]) { \
- [0] = { \
- .start = _irq, \
- .end = _irq, \
- .flags = IORESOURCE_IRQ \
- } \
+#define DEFINE_S3C_TIMER(_tmr_no) { \
+ .name = "s3c24xx-pwm", \
+ .id = _tmr_no, \
}
-#define DEFINE_S3C_TIMER(_tmr_no, _irq) \
- .name = "s3c24xx-pwm", \
- .id = _tmr_no, \
- .num_resources = TIMER_RESOURCE_SIZE, \
- .resource = TIMER_RESOURCE(_tmr_no, _irq), \
-
/*
* since we already have an static mapping for the timer,
* we do not bother setting any IO resource for the base.
*/
struct platform_device s3c_device_timer[] = {
- [0] = { DEFINE_S3C_TIMER(0, IRQ_TIMER0) },
- [1] = { DEFINE_S3C_TIMER(1, IRQ_TIMER1) },
- [2] = { DEFINE_S3C_TIMER(2, IRQ_TIMER2) },
- [3] = { DEFINE_S3C_TIMER(3, IRQ_TIMER3) },
- [4] = { DEFINE_S3C_TIMER(4, IRQ_TIMER4) },
+ [0] = DEFINE_S3C_TIMER(0),
+ [1] = DEFINE_S3C_TIMER(1),
+ [2] = DEFINE_S3C_TIMER(2),
+ [3] = DEFINE_S3C_TIMER(3),
+ [4] = DEFINE_S3C_TIMER(4),
};
#endif /* CONFIG_SAMSUNG_DEV_PWM */
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 09/12] clocksource: samsung-time: Do not use static IRQ definition
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (7 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 08/12] ARM: SAMSUNG: devs: Drop unnecessary IRQ resources of timer devices Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 10/12] clocksource: samsung-time: Move IRQ mask/ack handling to the driver Tomasz Figa
` (3 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
As another step towards multiplatform support, this patch modifies the
samsung-time clocksource driver and its users to pass timer IRQ numbers
through the samsung_timer_variant structure.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/mach-exynos/mach-universal_c210.c | 4 ++++
arch/arm/mach-s3c24xx/common.c | 3 +++
arch/arm/mach-s3c64xx/common.c | 4 ++++
arch/arm/mach-s5p64x0/common.c | 4 ++++
arch/arm/mach-s5pc100/common.c | 4 ++++
arch/arm/mach-s5pv210/common.c | 4 ++++
drivers/clocksource/samsung-time.c | 2 +-
include/linux/samsung-time.h | 1 +
8 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 50fe390..0573db7 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1092,6 +1092,10 @@ static struct platform_device *universal_devices[] __initdata = {
static const struct samsung_timer_variant universal_timer_variant = {
.reg_base = EXYNOS4_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
+ IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index 9a0584e..3344c33 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -222,6 +222,9 @@ static void s3c24xx_default_idle(void)
static const struct samsung_timer_variant s3c24xx_timer_variant = {
.reg_base = S3C24XX_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2, IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 16,
.prescale = 25,
.divisor = 50,
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index eb36740e..345d08a 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -151,6 +151,10 @@ static struct device s3c64xx_dev = {
static const struct samsung_timer_variant s3c64xx_timer_variant = {
.reg_base = S3C_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
+ IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index 0158c22..911122e 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -159,6 +159,10 @@ static void s5p64x0_idle(void)
static const struct samsung_timer_variant s5p64x0_timer_variant = {
.reg_base = S5P_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
+ IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index 5ca2f53..f45b1988 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -134,6 +134,10 @@ static struct map_desc s5pc100_iodesc[] __initdata = {
static const struct samsung_timer_variant s5pc100_timer_variant = {
.reg_base = S5P_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
+ IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index c80aa9c..a3ad2cf 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -151,6 +151,10 @@ void s5pv210_restart(char mode, const char *cmd)
static const struct samsung_timer_variant s5pv210_timer_variant = {
.reg_base = S5P_PA_TIMER,
+ .irqs = {
+ IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
+ IRQ_TIMER3, IRQ_TIMER4
+ },
.bits = 32,
.prescale = 2,
.divisor = 2,
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 29fc63f..3af3054 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -388,7 +388,7 @@ static void __init samsung_clockevent_init(void)
time_event_device.cpumask = cpumask_of(0);
clockevents_config_and_register(&time_event_device, clock_rate, 1, -1);
- irq_number = timer_source.event_id + IRQ_TIMER0;
+ irq_number = timer_variant.irqs[timer_source.event_id];
setup_irq(irq_number, &samsung_clock_event_irq);
}
diff --git a/include/linux/samsung-time.h b/include/linux/samsung-time.h
index 526ff99..8d8ffe8 100644
--- a/include/linux/samsung-time.h
+++ b/include/linux/samsung-time.h
@@ -29,6 +29,7 @@ struct samsung_timer_source {
struct samsung_timer_variant {
unsigned long reg_base;
+ unsigned int irqs[5];
int bits;
u16 prescale;
u16 divisor;
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 10/12] clocksource: samsung-time: Move IRQ mask/ack handling to the driver
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (8 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 09/12] clocksource: samsung-time: Do not use static IRQ definition Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 11/12] ARM: SAMSUNG: Remove unused PWM timer IRQ chip code Tomasz Figa
` (2 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
Since the clocksource driver is the only user of PWM timer interrupts,
there is no need to create an IRQ chip for handling them.
This patch the way of PWM timer interrupt handling to use real VIC/GIC
interrupt signals and handle PWM mask/ack register internally in
samsung-time driver.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/mach-exynos/include/mach/irqs.h | 3 +--
arch/arm/mach-exynos/mach-universal_c210.c | 5 +++--
arch/arm/mach-s3c24xx/common.c | 1 +
arch/arm/mach-s3c64xx/common.c | 8 +++-----
arch/arm/mach-s3c64xx/include/mach/irqs.h | 8 --------
arch/arm/mach-s5p64x0/common.c | 5 +++--
arch/arm/mach-s5p64x0/include/mach/irqs.h | 2 --
arch/arm/mach-s5pc100/common.c | 5 +++--
arch/arm/mach-s5pc100/include/mach/irqs.h | 2 --
arch/arm/mach-s5pv210/common.c | 5 +++--
arch/arm/mach-s5pv210/include/mach/irqs.h | 2 --
arch/arm/plat-samsung/include/plat/irqs.h | 9 ---------
arch/arm/plat-samsung/s5p-irq.c | 2 --
drivers/clocksource/samsung-time.c | 10 ++++++++++
include/linux/samsung-time.h | 1 +
15 files changed, 28 insertions(+), 40 deletions(-)
diff --git a/arch/arm/mach-exynos/include/mach/irqs.h b/arch/arm/mach-exynos/include/mach/irqs.h
index 6794292..98c97be 100644
--- a/arch/arm/mach-exynos/include/mach/irqs.h
+++ b/arch/arm/mach-exynos/include/mach/irqs.h
@@ -470,10 +470,9 @@
#define S5P_EINT_BASE2 (S5P_EINT_BASE1 + 16)
#define S5P_GPIOINT_BASE (S5P_EINT_BASE1 + 32)
#define IRQ_GPIO_END (S5P_GPIOINT_BASE + S5P_GPIOINT_COUNT)
-#define IRQ_TIMER_BASE (IRQ_GPIO_END + 64)
/* Set the default NR_IRQS */
-#define NR_IRQS (IRQ_TIMER_BASE + IRQ_TIMER_COUNT)
+#define NR_IRQS (IRQ_GPIO_END + 64)
#endif /* __ASM_ARCH_IRQS_H */
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c
index 0573db7..1f4af85 100644
--- a/arch/arm/mach-exynos/mach-universal_c210.c
+++ b/arch/arm/mach-exynos/mach-universal_c210.c
@@ -1093,12 +1093,13 @@ static struct platform_device *universal_devices[] __initdata = {
static const struct samsung_timer_variant universal_timer_variant = {
.reg_base = EXYNOS4_PA_TIMER,
.irqs = {
- IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
- IRQ_TIMER3, IRQ_TIMER4
+ IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
+ IRQ_TIMER3_VIC, IRQ_TIMER4_VIC
},
.bits = 32,
.prescale = 2,
.divisor = 2,
+ .has_tint_cstat = true,
};
static void __init universal_map_io(void)
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index 3344c33..c79307a 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -228,6 +228,7 @@ static const struct samsung_timer_variant s3c24xx_timer_variant = {
.bits = 16,
.prescale = 25,
.divisor = 50,
+ .has_tint_cstat = false,
};
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index 345d08a..4e1775f 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -152,12 +152,13 @@ static struct device s3c64xx_dev = {
static const struct samsung_timer_variant s3c64xx_timer_variant = {
.reg_base = S3C_PA_TIMER,
.irqs = {
- IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
- IRQ_TIMER3, IRQ_TIMER4
+ IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
+ IRQ_TIMER3_VIC, IRQ_TIMER4_VIC
},
.bits = 32,
.prescale = 2,
.divisor = 2,
+ .has_tint_cstat = true,
};
/* read cpu identification code */
@@ -202,9 +203,6 @@ void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid)
/* initialise the pair of VICs */
vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME);
vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME);
-
- /* add the timer sub-irqs */
- s3c_init_vic_timer_irq(5, IRQ_TIMER0);
}
#define eint_offset(irq) ((irq) - IRQ_EINT(0))
diff --git a/arch/arm/mach-s3c64xx/include/mach/irqs.h b/arch/arm/mach-s3c64xx/include/mach/irqs.h
index 96d60e0..67bbd1d 100644
--- a/arch/arm/mach-s3c64xx/include/mach/irqs.h
+++ b/arch/arm/mach-s3c64xx/include/mach/irqs.h
@@ -107,14 +107,6 @@
#define IRQ_TC IRQ_PENDN
#define IRQ_ADC S3C64XX_IRQ_VIC1(31)
-#define S3C64XX_TIMER_IRQ(x) S3C_IRQ(64 + (x))
-
-#define IRQ_TIMER0 S3C64XX_TIMER_IRQ(0)
-#define IRQ_TIMER1 S3C64XX_TIMER_IRQ(1)
-#define IRQ_TIMER2 S3C64XX_TIMER_IRQ(2)
-#define IRQ_TIMER3 S3C64XX_TIMER_IRQ(3)
-#define IRQ_TIMER4 S3C64XX_TIMER_IRQ(4)
-
/* compatibility for device defines */
#define IRQ_IIC1 IRQ_S3C6410_IIC1
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index 911122e..982e2d6 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -160,12 +160,13 @@ static void s5p64x0_idle(void)
static const struct samsung_timer_variant s5p64x0_timer_variant = {
.reg_base = S5P_PA_TIMER,
.irqs = {
- IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
- IRQ_TIMER3, IRQ_TIMER4
+ IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
+ IRQ_TIMER3_VIC, IRQ_TIMER4_VIC
},
.bits = 32,
.prescale = 2,
.divisor = 2,
+ .has_tint_cstat = true,
};
/*
diff --git a/arch/arm/mach-s5p64x0/include/mach/irqs.h b/arch/arm/mach-s5p64x0/include/mach/irqs.h
index 5b845e8..53982db 100644
--- a/arch/arm/mach-s5p64x0/include/mach/irqs.h
+++ b/arch/arm/mach-s5p64x0/include/mach/irqs.h
@@ -141,8 +141,6 @@
#define IRQ_EINT_GROUP(grp, x) (IRQ_EINT_GROUP##grp##_BASE + (x))
-#define IRQ_TIMER_BASE (11)
-
/* Set the default NR_IRQS */
#define NR_IRQS (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR + 1)
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index f45b1988..6b5364c 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -135,12 +135,13 @@ static struct map_desc s5pc100_iodesc[] __initdata = {
static const struct samsung_timer_variant s5pc100_timer_variant = {
.reg_base = S5P_PA_TIMER,
.irqs = {
- IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
- IRQ_TIMER3, IRQ_TIMER4
+ IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
+ IRQ_TIMER3_VIC, IRQ_TIMER4_VIC
},
.bits = 32,
.prescale = 2,
.divisor = 2,
+ .has_tint_cstat = true,
};
/*
diff --git a/arch/arm/mach-s5pc100/include/mach/irqs.h b/arch/arm/mach-s5pc100/include/mach/irqs.h
index 2870f12..d2eb475 100644
--- a/arch/arm/mach-s5pc100/include/mach/irqs.h
+++ b/arch/arm/mach-s5pc100/include/mach/irqs.h
@@ -97,8 +97,6 @@
#define IRQ_SDMFIQ S5P_IRQ_VIC2(31)
#define IRQ_VIC_END S5P_IRQ_VIC2(31)
-#define IRQ_TIMER_BASE (11)
-
#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0))
#define S5P_EINT_BASE2 (IRQ_VIC_END + 1)
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index a3ad2cf..8104bc7 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -152,12 +152,13 @@ void s5pv210_restart(char mode, const char *cmd)
static const struct samsung_timer_variant s5pv210_timer_variant = {
.reg_base = S5P_PA_TIMER,
.irqs = {
- IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2,
- IRQ_TIMER3, IRQ_TIMER4
+ IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
+ IRQ_TIMER3_VIC, IRQ_TIMER4_VIC
},
.bits = 32,
.prescale = 2,
.divisor = 2,
+ .has_tint_cstat = true,
};
/*
diff --git a/arch/arm/mach-s5pv210/include/mach/irqs.h b/arch/arm/mach-s5pv210/include/mach/irqs.h
index e777e01..5e0de3a 100644
--- a/arch/arm/mach-s5pv210/include/mach/irqs.h
+++ b/arch/arm/mach-s5pv210/include/mach/irqs.h
@@ -118,8 +118,6 @@
#define IRQ_MDNIE3 S5P_IRQ_VIC3(8)
#define IRQ_VIC_END S5P_IRQ_VIC3(31)
-#define IRQ_TIMER_BASE (11)
-
#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0))
#define S5P_EINT_BASE2 (IRQ_VIC_END + 1)
diff --git a/arch/arm/plat-samsung/include/plat/irqs.h b/arch/arm/plat-samsung/include/plat/irqs.h
index df46b77..039001c 100644
--- a/arch/arm/plat-samsung/include/plat/irqs.h
+++ b/arch/arm/plat-samsung/include/plat/irqs.h
@@ -44,15 +44,6 @@
#define S5P_IRQ_VIC2(x) (S5P_VIC2_BASE + (x))
#define S5P_IRQ_VIC3(x) (S5P_VIC3_BASE + (x))
-#define S5P_TIMER_IRQ(x) (IRQ_TIMER_BASE + (x))
-
-#define IRQ_TIMER0 S5P_TIMER_IRQ(0)
-#define IRQ_TIMER1 S5P_TIMER_IRQ(1)
-#define IRQ_TIMER2 S5P_TIMER_IRQ(2)
-#define IRQ_TIMER3 S5P_TIMER_IRQ(3)
-#define IRQ_TIMER4 S5P_TIMER_IRQ(4)
-#define IRQ_TIMER_COUNT (5)
-
#define IRQ_EINT(x) ((x) < 16 ? ((x) + S5P_EINT_BASE1) \
: ((x) - 16 + S5P_EINT_BASE2))
diff --git a/arch/arm/plat-samsung/s5p-irq.c b/arch/arm/plat-samsung/s5p-irq.c
index dfb47d6..a14d8e9 100644
--- a/arch/arm/plat-samsung/s5p-irq.c
+++ b/arch/arm/plat-samsung/s5p-irq.c
@@ -30,6 +30,4 @@ void __init s5p_init_irq(u32 *vic, u32 num_vic)
for (irq = 0; irq < num_vic; irq++)
vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);
#endif
-
- s3c_init_vic_timer_irq(5, IRQ_TIMER0);
}
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 3af3054..19a1c8a 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -355,6 +355,11 @@ static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)
{
struct clock_event_device *evt = dev_id;
+ if (timer_variant.has_tint_cstat) {
+ u32 mask = (1 << timer_source.event_id);
+ writel(mask | (mask << 5), S3C64XX_TINT_CSTAT);
+ }
+
evt->event_handler(evt);
return IRQ_HANDLED;
@@ -390,6 +395,11 @@ static void __init samsung_clockevent_init(void)
irq_number = timer_variant.irqs[timer_source.event_id];
setup_irq(irq_number, &samsung_clock_event_irq);
+
+ if (timer_variant.has_tint_cstat) {
+ u32 mask = (1 << timer_source.event_id);
+ writel(mask | (mask << 5), S3C64XX_TINT_CSTAT);
+ }
}
static void __iomem *samsung_timer_reg(void)
diff --git a/include/linux/samsung-time.h b/include/linux/samsung-time.h
index 8d8ffe8..45cf87b 100644
--- a/include/linux/samsung-time.h
+++ b/include/linux/samsung-time.h
@@ -33,6 +33,7 @@ struct samsung_timer_variant {
int bits;
u16 prescale;
u16 divisor;
+ bool has_tint_cstat;
};
extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 11/12] ARM: SAMSUNG: Remove unused PWM timer IRQ chip code
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (9 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 10/12] clocksource: samsung-time: Move IRQ mask/ack handling to the driver Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-10 13:20 ` [PATCH 12/12] clocksource: samsung-time: Add Device Tree support Tomasz Figa
2013-02-10 13:32 ` [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
12 siblings, 0 replies; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
As the need for an IRQ chip handling PWM timer interrupt chaining is
gone now, this patch removes all the code made unnecessary.
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
arch/arm/Kconfig | 1 -
arch/arm/mach-s3c64xx/common.c | 1 -
arch/arm/plat-samsung/Kconfig | 6 --
arch/arm/plat-samsung/Makefile | 1 -
arch/arm/plat-samsung/include/plat/irq-vic-timer.h | 13 ---
arch/arm/plat-samsung/irq-vic-timer.c | 98 ----------------------
arch/arm/plat-samsung/s5p-irq.c | 1 -
7 files changed, 121 deletions(-)
delete mode 100644 arch/arm/plat-samsung/include/plat/irq-vic-timer.h
delete mode 100644 arch/arm/plat-samsung/irq-vic-timer.c
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 8b72d23..2c85d52 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -778,7 +778,6 @@ config ARCH_S3C64XX
select S3C_GPIO_TRACK
select SAMSUNG_CLKSRC
select SAMSUNG_GPIOLIB_4BIT
- select SAMSUNG_IRQ_VIC_TIMER
select USB_ARCH_HAS_OHCI
help
Samsung S3C64XX series based systems
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index 4e1775f..6c71f57 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -41,7 +41,6 @@
#include <plat/pm.h>
#include <plat/gpio-cfg.h>
#include <plat/irq-uart.h>
-#include <plat/irq-vic-timer.h>
#include <plat/regs-irqtype.h>
#include <plat/regs-serial.h>
#include <linux/samsung-time.h>
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig
index 07ae984..6967144 100644
--- a/arch/arm/plat-samsung/Kconfig
+++ b/arch/arm/plat-samsung/Kconfig
@@ -27,7 +27,6 @@ config PLAT_S5P
select S5P_GPIO_DRVSTR
select SAMSUNG_CLKSRC
select SAMSUNG_GPIOLIB_4BIT
- select SAMSUNG_IRQ_VIC_TIMER
help
Base platform code for Samsung's S5P series SoC.
@@ -87,11 +86,6 @@ config S5P_CLOCK
# options for IRQ support
-config SAMSUNG_IRQ_VIC_TIMER
- bool
- help
- Internal configuration to build the VIC timer interrupt code.
-
config S5P_IRQ
def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
help
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile
index 87494e1..ae2a0fd 100644
--- a/arch/arm/plat-samsung/Makefile
+++ b/arch/arm/plat-samsung/Makefile
@@ -19,7 +19,6 @@ obj-$(CONFIG_SAMSUNG_CLOCK) += pwm-clock.o
obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o
obj-$(CONFIG_S5P_CLOCK) += s5p-clock.o
-obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o
obj-$(CONFIG_S5P_IRQ) += s5p-irq.o
obj-$(CONFIG_S5P_EXT_INT) += s5p-irq-eint.o
obj-$(CONFIG_S5P_GPIO_INT) += s5p-irq-gpioint.o
diff --git a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h b/arch/arm/plat-samsung/include/plat/irq-vic-timer.h
deleted file mode 100644
index 5b9c42f..0000000
--- a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* arch/arm/plat-samsung/include/plat/irq-vic-timer.h
- *
- * Copyright (c) 2010 Simtec Electronics
- * Ben Dooks <ben@simtec.co.uk>
- *
- * Header file for Samsung SoC IRQ VIC timer
- *
- * 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.
-*/
-
-extern void s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq);
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c
deleted file mode 100644
index f980cf3..0000000
--- a/arch/arm/plat-samsung/irq-vic-timer.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* arch/arm/plat-samsung/irq-vic-timer.c
- * originally part of arch/arm/plat-s3c64xx/irq.c
- *
- * Copyright 2008 Openmoko, Inc.
- * Copyright 2008 Simtec Electronics
- * Ben Dooks <ben@simtec.co.uk>
- * http://armlinux.simtec.co.uk/
- *
- * S3C64XX - Interrupt handling
- *
- * 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/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-
-#include <mach/map.h>
-#include <plat/cpu.h>
-#include <plat/irq-vic-timer.h>
-#include <plat/regs-timer.h>
-
-#include <asm/mach/irq.h>
-
-static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc)
-{
- struct irq_chip *chip = irq_get_chip(irq);
- chained_irq_enter(chip, desc);
- generic_handle_irq((int)desc->irq_data.handler_data);
- chained_irq_exit(chip, desc);
-}
-
-/* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */
-static void s3c_irq_timer_ack(struct irq_data *d)
-{
- struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
- u32 mask = (1 << 5) << (d->irq - gc->irq_base);
-
- irq_reg_writel(mask | gc->mask_cache, gc->reg_base);
-}
-
-/**
- * s3c_init_vic_timer_irq() - initialise timer irq chanined off VIC.\
- * @num: Number of timers to initialize
- * @timer_irq: Base IRQ number to be used for the timers.
- *
- * Register the necessary IRQ chaining and support for the timer IRQs
- * chained of the VIC.
- */
-void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)
-{
- unsigned int pirq[5] = { IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
- IRQ_TIMER3_VIC, IRQ_TIMER4_VIC };
- struct irq_chip_generic *s3c_tgc;
- struct irq_chip_type *ct;
- unsigned int i;
-
-#ifdef CONFIG_ARCH_EXYNOS
- if (soc_is_exynos5250()) {
- pirq[0] = EXYNOS5_IRQ_TIMER0_VIC;
- pirq[1] = EXYNOS5_IRQ_TIMER1_VIC;
- pirq[2] = EXYNOS5_IRQ_TIMER2_VIC;
- pirq[3] = EXYNOS5_IRQ_TIMER3_VIC;
- pirq[4] = EXYNOS5_IRQ_TIMER4_VIC;
- } else {
- pirq[0] = EXYNOS4_IRQ_TIMER0_VIC;
- pirq[1] = EXYNOS4_IRQ_TIMER1_VIC;
- pirq[2] = EXYNOS4_IRQ_TIMER2_VIC;
- pirq[3] = EXYNOS4_IRQ_TIMER3_VIC;
- pirq[4] = EXYNOS4_IRQ_TIMER4_VIC;
- }
-#endif
- s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,
- S3C64XX_TINT_CSTAT, handle_level_irq);
-
- if (!s3c_tgc) {
- pr_err("%s: irq_alloc_generic_chip for IRQ %d failed\n",
- __func__, timer_irq);
- return;
- }
-
- ct = s3c_tgc->chip_types;
- ct->chip.irq_mask = irq_gc_mask_clr_bit;
- ct->chip.irq_unmask = irq_gc_mask_set_bit;
- ct->chip.irq_ack = s3c_irq_timer_ack;
- irq_setup_generic_chip(s3c_tgc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
- IRQ_NOREQUEST | IRQ_NOPROBE, 0);
- /* Clear the upper bits of the mask_cache*/
- s3c_tgc->mask_cache &= 0x1f;
-
- for (i = 0; i < num; i++, timer_irq++) {
- irq_set_chained_handler(pirq[i], s3c_irq_demux_vic_timer);
- irq_set_handler_data(pirq[i], (void *)timer_irq);
- }
-}
diff --git a/arch/arm/plat-samsung/s5p-irq.c b/arch/arm/plat-samsung/s5p-irq.c
index a14d8e9..f6404f7 100644
--- a/arch/arm/plat-samsung/s5p-irq.c
+++ b/arch/arm/plat-samsung/s5p-irq.c
@@ -19,7 +19,6 @@
#include <mach/map.h>
#include <plat/regs-timer.h>
#include <plat/cpu.h>
-#include <plat/irq-vic-timer.h>
void __init s5p_init_irq(u32 *vic, u32 num_vic)
{
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 12/12] clocksource: samsung-time: Add Device Tree support
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (10 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 11/12] ARM: SAMSUNG: Remove unused PWM timer IRQ chip code Tomasz Figa
@ 2013-02-10 13:20 ` Tomasz Figa
2013-02-11 11:00 ` Mark Rutland
2013-02-10 13:32 ` [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
12 siblings, 1 reply; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:20 UTC (permalink / raw)
To: linux-arm-kernel
This patch adds support for parsing all platform-specific data from
Device Tree and instantiation using clocksource_of_init to samsung-time
clocksource driver.
Cc: devicetree-discuss at lists.ozlabs.org
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
---
.../devicetree/bindings/arm/samsung-timer.txt | 32 +++++++
drivers/clocksource/samsung-time.c | 102 ++++++++++++++++++++-
2 files changed, 131 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/samsung-timer.txt
diff --git a/Documentation/devicetree/bindings/arm/samsung-timer.txt b/Documentation/devicetree/bindings/arm/samsung-timer.txt
new file mode 100644
index 0000000..8eb7030
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/samsung-timer.txt
@@ -0,0 +1,32 @@
+* Samsung PWM timer
+
+Samsung SoCs contain PWM timer blocks which can be used for system clock source
+and clock event timers.
+
+Be aware that this configuration is supported only on uniprocessor platforms.
+For SMP SoCs, SMP-aware timers should be used, like MCT.
+
+Required properties:
+- compatible : should be one of following:
+ samsung,s3c24xx-pwm-timer - for 16-bit timers present on S3C24xx
+ samsung,s3c64xx-pwm-timer - for 32-bit timers present on S3C64xx and newer
+- reg: base address and size of register area
+- interrupts: interrupt list for all five PWM timers.
+- samsung,source-timer: index of timer to be used as clocksource
+- samsung,event-timer: index of timer to be used as clock event
+
+Optional properties:
+- samsung,prescale: PWM prescaler divisor (from 1 to 256)
+- samsung,divisor: PWM main divider divisor (1, 2, 4, 8 or 16)
+
+Example:
+ timer at 7f006000 {
+ compatible = "samsung,s3c64xx-pwm-timer";
+ reg = <0x7f006000 0x1000>;
+ interrupt-parent = <&vic0>;
+ interrupts = <23>, <24>, <25>, <27>, <28>;
+ samsung,source-timer = <4>;
+ samsung,event-timer = <3>;
+ samsung,prescale = <2>;
+ samsung,divisor = <1>;
+ };
diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
index 19a1c8a..63d2992 100644
--- a/drivers/clocksource/samsung-time.c
+++ b/drivers/clocksource/samsung-time.c
@@ -14,6 +14,9 @@
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/clockchips.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
#include <linux/platform_device.h>
#include <linux/samsung-time.h>
@@ -479,9 +482,11 @@ static void __init samsung_timer_resources(void)
unsigned long source_id = timer_source.source_id;
char devname[15];
- timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
- if (!timer_base)
- panic("failed to map timer registers");
+ if (!timer_base) {
+ timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
+ if (!timer_base)
+ panic("failed to map timer registers");
+ }
timerclk = clk_get(NULL, "timers");
if (IS_ERR(timerclk))
@@ -514,8 +519,92 @@ static void __init samsung_timer_resources(void)
clk_enable(tin_source);
}
+enum {
+ TYPE_S3C24XX,
+ TYPE_S3C64XX,
+};
+
+#ifdef CONFIG_OF
+static const struct of_device_id samsung_timer_ids[] = {
+ { .compatible = "samsung,s3c24xx-pwm-timer",
+ .data = (void *)TYPE_S3C24XX, },
+ { .compatible = "samsung,s3c64xx-pwm-timer",
+ .data = (void *)TYPE_S3C64XX, },
+ {},
+};
+
+static void samsung_timer_parse_dt(struct device_node *np,
+ const struct of_device_id *match)
+{
+ int i;
+ u32 val;
+
+ if (of_property_read_u32(np, "samsung,source-timer", &val))
+ panic("no samsung,source-timer property provided");
+ if (val > ARRAY_SIZE(timer_variant.irqs))
+ panic("samsung,source-timer property out of range");
+ timer_source.source_id = val;
+
+ if (of_property_read_u32(np, "samsung,event-timer", &val))
+ panic("no samsung,event-timer property provided");
+ if (val > ARRAY_SIZE(timer_variant.irqs))
+ panic("samsung,event-timer property out of range");
+ timer_source.event_id = val;
+
+ timer_base = of_iomap(np, 0);
+ if (!timer_base)
+ panic("failed to map timer registers");
+
+ for (i = 0; i < ARRAY_SIZE(timer_variant.irqs); ++i)
+ timer_variant.irqs[i] = irq_of_parse_and_map(np, i);
+
+ if (!timer_variant.irqs[timer_source.event_id])
+ panic("no clock event irq provided");
+
+ switch ((unsigned int)match->data) {
+ case TYPE_S3C24XX:
+ timer_variant.bits = 16;
+ timer_variant.prescale = 25;
+ timer_variant.prescale = 50;
+ timer_variant.has_tint_cstat = false;
+ break;
+ case TYPE_S3C64XX:
+ timer_variant.bits = 32;
+ timer_variant.prescale = 2;
+ timer_variant.divisor = 2;
+ timer_variant.has_tint_cstat = true;
+ break;
+ }
+
+ if (!of_property_read_u32(np, "samsung,prescale", &val)) {
+ if (val < 1 || val > 256)
+ panic("prescale must be from 1 to 256 range");
+ timer_variant.prescale = val;
+ }
+
+ if (!of_property_read_u32(np, "samsung,divisor", &val)) {
+ if (val > 16 || (1 << (fls(val) - 1)) != val)
+ panic("divsor must be 1, 2, 4, 8 or 16");
+ timer_variant.divisor = timer_variant.prescale * val;
+ }
+}
+#endif
+
void __init samsung_timer_init(void)
{
+#ifdef CONFIG_OF
+ struct device_node *np;
+ const struct of_device_id *match;
+
+ if (of_have_populated_dt()) {
+ np = of_find_matching_node_and_match(NULL,
+ samsung_timer_ids, &match);
+ if (!np)
+ panic("timer node not found");
+
+ samsung_timer_parse_dt(np, match);
+ }
+#endif
if (!timer_source.source_id && !timer_source.event_id)
panic("timer sources not set (see samsung_set_timer_source)!\n");
@@ -526,3 +615,10 @@ void __init samsung_timer_init(void)
samsung_clockevent_init();
samsung_clocksource_init();
}
+
+#ifdef CONFIG_OF
+CLOCKSOURCE_OF_DECLARE(s3c24xx_timer,
+ "samsung,s3c24xx-pwm-timer", samsung_timer_init)
+CLOCKSOURCE_OF_DECLARE(s3c64xx_timer,
+ "samsung,s3c64xx-pwm-timer", samsung_timer_init)
+#endif
--
1.8.1.2
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 12/12] clocksource: samsung-time: Add Device Tree support
2013-02-10 13:20 ` [PATCH 12/12] clocksource: samsung-time: Add Device Tree support Tomasz Figa
@ 2013-02-11 11:00 ` Mark Rutland
2013-02-11 23:46 ` Tomasz Figa
0 siblings, 1 reply; 20+ messages in thread
From: Mark Rutland @ 2013-02-11 11:00 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Feb 10, 2013 at 01:20:23PM +0000, Tomasz Figa wrote:
> This patch adds support for parsing all platform-specific data from
> Device Tree and instantiation using clocksource_of_init to samsung-time
> clocksource driver.
>
> Cc: devicetree-discuss at lists.ozlabs.org
> Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
> ---
> .../devicetree/bindings/arm/samsung-timer.txt | 32 +++++++
> drivers/clocksource/samsung-time.c | 102 ++++++++++++++++++++-
> 2 files changed, 131 insertions(+), 3 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/arm/samsung-timer.txt
>
> diff --git a/Documentation/devicetree/bindings/arm/samsung-timer.txt b/Documentation/devicetree/bindings/arm/samsung-timer.txt
> new file mode 100644
> index 0000000..8eb7030
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/samsung-timer.txt
> @@ -0,0 +1,32 @@
> +* Samsung PWM timer
> +
> +Samsung SoCs contain PWM timer blocks which can be used for system clock source
> +and clock event timers.
> +
> +Be aware that this configuration is supported only on uniprocessor platforms.
> +For SMP SoCs, SMP-aware timers should be used, like MCT.
> +
> +Required properties:
> +- compatible : should be one of following:
> + samsung,s3c24xx-pwm-timer - for 16-bit timers present on S3C24xx
> + samsung,s3c64xx-pwm-timer - for 32-bit timers present on S3C64xx and newer
> +- reg: base address and size of register area
> +- interrupts: interrupt list for all five PWM timers.
Is this a set of combined interrupts, or one per timer?
Which order are they in?
Assuming they're one per timer, in order, how about something like:
"- interrupts: one interrupt per timer, starting at timer 0".
> +- samsung,source-timer: index of timer to be used as clocksource
> +- samsung,event-timer: index of timer to be used as clock event
Is there any reason this needs to be specified in the dt?
Can the driver not just select two arbitrary timers from the hardware?
> +
> +Optional properties:
> +- samsung,prescale: PWM prescaler divisor (from 1 to 256)
It might be better to have this named "samsung,prescale-divisor" to make it
clear to the average reader that its a divisor value rather than a
multiplier value.
> +- samsung,divisor: PWM main divider divisor (1, 2, 4, 8 or 16)
> +
> +Example:
> + timer at 7f006000 {
> + compatible = "samsung,s3c64xx-pwm-timer";
> + reg = <0x7f006000 0x1000>;
> + interrupt-parent = <&vic0>;
> + interrupts = <23>, <24>, <25>, <27>, <28>;
> + samsung,source-timer = <4>;
> + samsung,event-timer = <3>;
> + samsung,prescale = <2>;
> + samsung,divisor = <1>;
> + };
> diff --git a/drivers/clocksource/samsung-time.c b/drivers/clocksource/samsung-time.c
> index 19a1c8a..63d2992 100644
> --- a/drivers/clocksource/samsung-time.c
> +++ b/drivers/clocksource/samsung-time.c
> @@ -14,6 +14,9 @@
> #include <linux/err.h>
> #include <linux/clk.h>
> #include <linux/clockchips.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_irq.h>
> #include <linux/platform_device.h>
> #include <linux/samsung-time.h>
>
> @@ -479,9 +482,11 @@ static void __init samsung_timer_resources(void)
> unsigned long source_id = timer_source.source_id;
> char devname[15];
>
> - timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> - if (!timer_base)
> - panic("failed to map timer registers");
> + if (!timer_base) {
> + timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> + if (!timer_base)
> + panic("failed to map timer registers");
> + }
You map 4K here, but the binding didn't mention that 4K is always the expected
size of the reg.
>
> timerclk = clk_get(NULL, "timers");
> if (IS_ERR(timerclk))
> @@ -514,8 +519,92 @@ static void __init samsung_timer_resources(void)
> clk_enable(tin_source);
> }
>
> +enum {
> + TYPE_S3C24XX,
> + TYPE_S3C64XX,
> +};
> +
> +#ifdef CONFIG_OF
> +static const struct of_device_id samsung_timer_ids[] = {
> + { .compatible = "samsung,s3c24xx-pwm-timer",
> + .data = (void *)TYPE_S3C24XX, },
> + { .compatible = "samsung,s3c64xx-pwm-timer",
> + .data = (void *)TYPE_S3C64XX, },
> + {},
> +};
> +
> +static void samsung_timer_parse_dt(struct device_node *np,
> + const struct of_device_id *match)
> +{
> + int i;
> + u32 val;
> +
> + if (of_property_read_u32(np, "samsung,source-timer", &val))
> + panic("no samsung,source-timer property provided");
> + if (val > ARRAY_SIZE(timer_variant.irqs))
> + panic("samsung,source-timer property out of range");
This check doesn't tell you if you actually had an irq in the dt for the timer
at that index.
Do you really need to panic here? Can you not just warn?
What if a future platform has another timer driver that can at least get the
board to boot?
> + timer_source.source_id = val;
> +
> + if (of_property_read_u32(np, "samsung,event-timer", &val))
> + panic("no samsung,event-timer property provided");
> + if (val > ARRAY_SIZE(timer_variant.irqs))
> + panic("samsung,event-timer property out of range");
> + timer_source.event_id = val;
I have the same problems here as with the source-timer block above.
> +
> + timer_base = of_iomap(np, 0);
> + if (!timer_base)
> + panic("failed to map timer registers");
Similarly here and every other place that panics: I think warning might be a
better bet.
> +
> + for (i = 0; i < ARRAY_SIZE(timer_variant.irqs); ++i)
> + timer_variant.irqs[i] = irq_of_parse_and_map(np, i);
> +
> + if (!timer_variant.irqs[timer_source.event_id])
> + panic("no clock event irq provided");
> +
> + switch ((unsigned int)match->data) {
> + case TYPE_S3C24XX:
> + timer_variant.bits = 16;
> + timer_variant.prescale = 25;
> + timer_variant.prescale = 50;
> + timer_variant.has_tint_cstat = false;
> + break;
> + case TYPE_S3C64XX:
> + timer_variant.bits = 32;
> + timer_variant.prescale = 2;
> + timer_variant.divisor = 2;
> + timer_variant.has_tint_cstat = true;
> + break;
> + }
> +
> + if (!of_property_read_u32(np, "samsung,prescale", &val)) {
> + if (val < 1 || val > 256)
> + panic("prescale must be from 1 to 256 range");
> + timer_variant.prescale = val;
> + }
> +
> + if (!of_property_read_u32(np, "samsung,divisor", &val)) {
> + if (val > 16 || (1 << (fls(val) - 1)) != val)
> + panic("divsor must be 1, 2, 4, 8 or 16");
> + timer_variant.divisor = timer_variant.prescale * val;
Maybe it's just me, but I find this somewhat difficult to read.
How about something like:
switch (val) {
case 1:
case 2:
case 4:
case 8:
case 16:
timer_variant.divisor = timer_variant.prescale * val;
break;
default:
warn("no divisor specified");
};
Thanks,
Mark.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 12/12] clocksource: samsung-time: Add Device Tree support
2013-02-11 11:00 ` Mark Rutland
@ 2013-02-11 23:46 ` Tomasz Figa
2013-02-12 11:06 ` Mark Rutland
0 siblings, 1 reply; 20+ messages in thread
From: Tomasz Figa @ 2013-02-11 23:46 UTC (permalink / raw)
To: linux-arm-kernel
Hi Mark,
Thanks for your comments. See my replies inline.
On Monday 11 of February 2013 11:00:56 Mark Rutland wrote:
> On Sun, Feb 10, 2013 at 01:20:23PM +0000, Tomasz Figa wrote:
> > This patch adds support for parsing all platform-specific data from
> > Device Tree and instantiation using clocksource_of_init to
> > samsung-time
> > clocksource driver.
> >
> > Cc: devicetree-discuss at lists.ozlabs.org
> > Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
> > ---
> >
> > .../devicetree/bindings/arm/samsung-timer.txt | 32 +++++++
> > drivers/clocksource/samsung-time.c | 102
> > ++++++++++++++++++++- 2 files changed, 131 insertions(+), 3
> > deletions(-)
> > create mode 100644
> > Documentation/devicetree/bindings/arm/samsung-timer.txt>
> > diff --git a/Documentation/devicetree/bindings/arm/samsung-timer.txt
> > b/Documentation/devicetree/bindings/arm/samsung-timer.txt new file
> > mode 100644
> > index 0000000..8eb7030
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/arm/samsung-timer.txt
> > @@ -0,0 +1,32 @@
> > +* Samsung PWM timer
> > +
> > +Samsung SoCs contain PWM timer blocks which can be used for system
> > clock source +and clock event timers.
> > +
> > +Be aware that this configuration is supported only on uniprocessor
> > platforms. +For SMP SoCs, SMP-aware timers should be used, like MCT.
> > +
> > +Required properties:
> > +- compatible : should be one of following:
> > + samsung,s3c24xx-pwm-timer - for 16-bit timers present on S3C24xx
> > + samsung,s3c64xx-pwm-timer - for 32-bit timers present on S3C64xx
> > and newer +- reg: base address and size of register area
> > +- interrupts: interrupt list for all five PWM timers.
>
> Is this a set of combined interrupts, or one per timer?
It is one per timer, however the node represents a single PWM timer block
that contains several timers (usually 5).
> Which order are they in?
>
> Assuming they're one per timer, in order, how about something like:
>
> "- interrupts: one interrupt per timer, starting at timer 0".
Sounds fine to me. I will modify the description in next version.
> > +- samsung,source-timer: index of timer to be used as clocksource
> > +- samsung,event-timer: index of timer to be used as clock event
>
> Is there any reason this needs to be specified in the dt?
Yes. On some SoCs selected channels of PWM block can be used as PWM
outputs and so thsoe cannot be used for system timers. This property makes
it possible to specify channels used as system timers on particular
platform (board).
> Can the driver not just select two arbitrary timers from the hardware?
In most cases I could statically choose channel 3 and 4 as it was done
before my patches on S3C24xx and S3C64xx. I can make those channels
default if others are not specified in properties.
> > +
> > +Optional properties:
> > +- samsung,prescale: PWM prescaler divisor (from 1 to 256)
>
> It might be better to have this named "samsung,prescale-divisor" to make
> it clear to the average reader that its a divisor value rather than a
> multiplier value.
Right.
>
> > +- samsung,divisor: PWM main divider divisor (1, 2, 4, 8 or 16)
> > +
> > +Example:
> > + timer at 7f006000 {
> > + compatible = "samsung,s3c64xx-pwm-timer";
> > + reg = <0x7f006000 0x1000>;
> > + interrupt-parent = <&vic0>;
> > + interrupts = <23>, <24>, <25>, <27>, <28>;
> > + samsung,source-timer = <4>;
> > + samsung,event-timer = <3>;
> > + samsung,prescale = <2>;
> > + samsung,divisor = <1>;
> > + };
> > diff --git a/drivers/clocksource/samsung-time.c
> > b/drivers/clocksource/samsung-time.c index 19a1c8a..63d2992 100644
> > --- a/drivers/clocksource/samsung-time.c
> > +++ b/drivers/clocksource/samsung-time.c
> > @@ -14,6 +14,9 @@
> >
> > #include <linux/err.h>
> > #include <linux/clk.h>
> > #include <linux/clockchips.h>
> >
> > +#include <linux/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/of_irq.h>
> >
> > #include <linux/platform_device.h>
> > #include <linux/samsung-time.h>
> >
> > @@ -479,9 +482,11 @@ static void __init samsung_timer_resources(void)
> >
> > unsigned long source_id = timer_source.source_id;
> > char devname[15];
> >
> > - timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> > - if (!timer_base)
> > - panic("failed to map timer registers");
> > + if (!timer_base) {
> > + timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> > + if (!timer_base)
> > + panic("failed to map timer registers");
> > + }
>
> You map 4K here, but the binding didn't mention that 4K is always the
> expected size of the reg.
This is a compatibility mapping for legacy (non-DT) platforms that will be
removed once all platforms get moved to DT.
> > timerclk = clk_get(NULL, "timers");
> > if (IS_ERR(timerclk))
> >
> > @@ -514,8 +519,92 @@ static void __init samsung_timer_resources(void)
> >
> > clk_enable(tin_source);
> >
> > }
> >
> > +enum {
> > + TYPE_S3C24XX,
> > + TYPE_S3C64XX,
> > +};
> > +
> > +#ifdef CONFIG_OF
> > +static const struct of_device_id samsung_timer_ids[] = {
> > + { .compatible = "samsung,s3c24xx-pwm-timer",
> > + .data = (void *)TYPE_S3C24XX, },
> > + { .compatible = "samsung,s3c64xx-pwm-timer",
> > + .data = (void *)TYPE_S3C64XX, },
> > + {},
> > +};
> > +
> > +static void samsung_timer_parse_dt(struct device_node *np,
> > + const struct of_device_id *match)
> > +{
> > + int i;
> > + u32 val;
> > +
> > + if (of_property_read_u32(np, "samsung,source-timer", &val))
> > + panic("no samsung,source-timer property provided");
> > + if (val > ARRAY_SIZE(timer_variant.irqs))
> > + panic("samsung,source-timer property out of range");
>
> This check doesn't tell you if you actually had an irq in the dt for the
> timer at that index.
Hmm, this line is probably a bit confusing. I will add a define with
maximum number of channels and use it here. This is only a check whether
the index given is not out of range.
> Do you really need to panic here? Can you not just warn?
>
> What if a future platform has another timer driver that can at least get
> the board to boot?
It's rather unlikely that new platforms using samsung-time will show up.
This clocksource is used only for non-SMP platforms based on S3C and S5P
SoCs, where it is the only possible supported clocksource.
> > + timer_source.source_id = val;
> > +
> > + if (of_property_read_u32(np, "samsung,event-timer", &val))
> > + panic("no samsung,event-timer property provided");
> > + if (val > ARRAY_SIZE(timer_variant.irqs))
> > + panic("samsung,event-timer property out of range");
> > + timer_source.event_id = val;
>
> I have the same problems here as with the source-timer block above.
>
> > +
> > + timer_base = of_iomap(np, 0);
> > + if (!timer_base)
> > + panic("failed to map timer registers");
>
> Similarly here and every other place that panics: I think warning might
> be a better bet.
>
> > +
> > + for (i = 0; i < ARRAY_SIZE(timer_variant.irqs); ++i)
> > + timer_variant.irqs[i] = irq_of_parse_and_map(np, i);
> > +
> > + if (!timer_variant.irqs[timer_source.event_id])
> > + panic("no clock event irq provided");
> > +
> > + switch ((unsigned int)match->data) {
> > + case TYPE_S3C24XX:
> > + timer_variant.bits = 16;
> > + timer_variant.prescale = 25;
> > + timer_variant.prescale = 50;
> > + timer_variant.has_tint_cstat = false;
> > + break;
> > + case TYPE_S3C64XX:
> > + timer_variant.bits = 32;
> > + timer_variant.prescale = 2;
> > + timer_variant.divisor = 2;
> > + timer_variant.has_tint_cstat = true;
> > + break;
> > + }
> > +
> > + if (!of_property_read_u32(np, "samsung,prescale", &val)) {
> > + if (val < 1 || val > 256)
> > + panic("prescale must be from 1 to 256 range");
> > + timer_variant.prescale = val;
> > + }
> > +
> > + if (!of_property_read_u32(np, "samsung,divisor", &val)) {
> > + if (val > 16 || (1 << (fls(val) - 1)) != val)
> > + panic("divsor must be 1, 2, 4, 8 or 16");
> > + timer_variant.divisor = timer_variant.prescale * val;
>
> Maybe it's just me, but I find this somewhat difficult to read.
>
> How about something like:
>
> switch (val) {
> case 1:
> case 2:
> case 4:
> case 8:
> case 16:
> timer_variant.divisor = timer_variant.prescale * val;
> break;
> default:
> warn("no divisor specified");
> };
It looks better indeed. I will change this part in next version.
Best regards,
Tomasz
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 12/12] clocksource: samsung-time: Add Device Tree support
2013-02-11 23:46 ` Tomasz Figa
@ 2013-02-12 11:06 ` Mark Rutland
0 siblings, 0 replies; 20+ messages in thread
From: Mark Rutland @ 2013-02-12 11:06 UTC (permalink / raw)
To: linux-arm-kernel
Hi Tomasz,
[...]
> > > +Required properties:
> > > +- compatible : should be one of following:
> > > + samsung,s3c24xx-pwm-timer - for 16-bit timers present on S3C24xx
> > > + samsung,s3c64xx-pwm-timer - for 32-bit timers present on S3C64xx
> > > and newer +- reg: base address and size of register area
> > > +- interrupts: interrupt list for all five PWM timers.
> >
> > Is this a set of combined interrupts, or one per timer?
>
> It is one per timer, however the node represents a single PWM timer block
> that contains several timers (usually 5).
>
> > Which order are they in?
> >
> > Assuming they're one per timer, in order, how about something like:
> >
> > "- interrupts: one interrupt per timer, starting at timer 0".
>
> Sounds fine to me. I will modify the description in next version.
Great.
> > > +- samsung,source-timer: index of timer to be used as clocksource
> > > +- samsung,event-timer: index of timer to be used as clock event
> >
> > Is there any reason this needs to be specified in the dt?
>
> Yes. On some SoCs selected channels of PWM block can be used as PWM
> outputs and so thsoe cannot be used for system timers. This property makes
> it possible to specify channels used as system timers on particular
> platform (board).
>
> > Can the driver not just select two arbitrary timers from the hardware?
>
> In most cases I could statically choose channel 3 and 4 as it was done
> before my patches on S3C24xx and S3C64xx. I can make those channels
> default if others are not specified in properties.
That would be nice, it would mean we could have some less verbose dts :)
[...]
> > > - timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> > > - if (!timer_base)
> > > - panic("failed to map timer registers");
> > > + if (!timer_base) {
> > > + timer_base = ioremap_nocache(timer_variant.reg_base, SZ_4K);
> > > + if (!timer_base)
> > > + panic("failed to map timer registers");
> > > + }
> >
> > You map 4K here, but the binding didn't mention that 4K is always the
> > expected size of the reg.
>
> This is a compatibility mapping for legacy (non-DT) platforms that will be
> removed once all platforms get moved to DT.
Sounds reasonable.
[...]
> > > + if (of_property_read_u32(np, "samsung,source-timer", &val))
> > > + panic("no samsung,source-timer property provided");
> > > + if (val > ARRAY_SIZE(timer_variant.irqs))
> > > + panic("samsung,source-timer property out of range");
> >
> > This check doesn't tell you if you actually had an irq in the dt for the
> > timer at that index.
>
> Hmm, this line is probably a bit confusing. I will add a define with
> maximum number of channels and use it here. This is only a check whether
> the index given is not out of range.
Ok.
> > Do you really need to panic here? Can you not just warn?
> >
> > What if a future platform has another timer driver that can at least get
> > the board to boot?
>
> It's rather unlikely that new platforms using samsung-time will show up.
> This clocksource is used only for non-SMP platforms based on S3C and S5P
> SoCs, where it is the only possible supported clocksource.
Ok.
[...]
> > > + if (!of_property_read_u32(np, "samsung,divisor", &val)) {
> > > + if (val > 16 || (1 << (fls(val) - 1)) != val)
> > > + panic("divsor must be 1, 2, 4, 8 or 16");
> > > + timer_variant.divisor = timer_variant.prescale * val;
> >
> > Maybe it's just me, but I find this somewhat difficult to read.
> >
> > How about something like:
> >
> > switch (val) {
> > case 1:
> > case 2:
> > case 4:
> > case 8:
> > case 16:
> > timer_variant.divisor = timer_variant.prescale * val;
> > break;
> > default:
> > warn("no divisor specified");
> > };
>
> It looks better indeed. I will change this part in next version.
Great.
Thanks,
Mark.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support
2013-02-10 13:20 [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
` (11 preceding siblings ...)
2013-02-10 13:20 ` [PATCH 12/12] clocksource: samsung-time: Add Device Tree support Tomasz Figa
@ 2013-02-10 13:32 ` Tomasz Figa
2013-02-10 14:12 ` Kyungmin Park
12 siblings, 1 reply; 20+ messages in thread
From: Tomasz Figa @ 2013-02-10 13:32 UTC (permalink / raw)
To: linux-arm-kernel
Seems like several mail addresses of board maintainers are no longer
valid.
guillaume.gourat at nexvision.tv
mentioned in:
arch/arm/mach-s3c24xx/mach-nexcoder.c
arch/arm/mach-s3c24xx/mach-otom.c
arhuaco at freaks-unidos.net
mentioned in:
arch/arm/mach-s3c24xx/mach-gta02.c
danders at amltd.com
mentioned in:
arch/arm/mach-s3c24xx/mach-amlm5900.c
arch/arm/mach-s3c24xx/mach-tct_hammer.c
bhmin at samsung.com
mentioned in:
arch/arm/mach-s5pc100/mach-smdkc100
and a bunch of files in arch/arm/mach-s5pc100
I wonder if we should do anything with them?
Best regards,
Tomasz
On Sunday 10 of February 2013 14:20:11 Tomasz Figa wrote:
> This series is an attempt to make the samsung-time clocksource driver
> ready for multiplatform kernels. It moves the driver to
> drivers/clocksource, cleans it up from uses of static platform-specific
> definitions, simplifies timer interrupt handling and adds Device Tree
> support.
>
> Tested on a Tiny6410 board (Mini6410-compatible) both with and without
> Devicee Tree (with my DT patches for S3C64xx). Compile tested for other
> related archs.
>
> Tomasz Figa (12):
> ARM: SAMSUNG: Move samsung-time to drivers/clocksource
> clocksource: samsung-time: Set platform-specific parameters at runtime
> clocksource: samsung-time: Drop useless defines from public header
> clocksource: samsung-time: Move samsung-time.h header to include/linux
> clocksource: samsung-time: Use local register definitions
> clocksource: samsung-time: Remove use of static register mapping
> clocksource: samsung-time: Use clk_get_sys for getting clocks
> ARM: SAMSUNG: devs: Drop unnecessary IRQ resources of timer devices
> clocksource: samsung-time: Do not use static IRQ definition
> clocksource: samsung-time: Move IRQ mask/ack handling to the driver
> ARM: SAMSUNG: Remove unused PWM timer IRQ chip code
> clocksource: samsung-time: Add Device Tree support
>
> .../devicetree/bindings/arm/samsung-timer.txt | 32 ++
> arch/arm/Kconfig | 1 -
> arch/arm/mach-exynos/include/mach/irqs.h | 3 +-
> arch/arm/mach-exynos/mach-universal_c210.c | 15 +-
> arch/arm/mach-s3c24xx/common.c | 14 +
> arch/arm/mach-s3c24xx/mach-amlm5900.c | 2 +-
> arch/arm/mach-s3c24xx/mach-anubis.c | 2 +-
> arch/arm/mach-s3c24xx/mach-at2440evb.c | 2 +-
> arch/arm/mach-s3c24xx/mach-bast.c | 2 +-
> arch/arm/mach-s3c24xx/mach-gta02.c | 2 +-
> arch/arm/mach-s3c24xx/mach-h1940.c | 2 +-
> arch/arm/mach-s3c24xx/mach-jive.c | 2 +-
> arch/arm/mach-s3c24xx/mach-mini2440.c | 2 +-
> arch/arm/mach-s3c24xx/mach-n30.c | 2 +-
> arch/arm/mach-s3c24xx/mach-nexcoder.c | 2 +-
> arch/arm/mach-s3c24xx/mach-osiris.c | 2 +-
> arch/arm/mach-s3c24xx/mach-otom.c | 2 +-
> arch/arm/mach-s3c24xx/mach-qt2410.c | 2 +-
> arch/arm/mach-s3c24xx/mach-rx1950.c | 2 +-
> arch/arm/mach-s3c24xx/mach-rx3715.c | 2 +-
> arch/arm/mach-s3c24xx/mach-smdk2410.c | 2 +-
> arch/arm/mach-s3c24xx/mach-smdk2413.c | 2 +-
> arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +-
> arch/arm/mach-s3c24xx/mach-smdk2440.c | 2 +-
> arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +-
> arch/arm/mach-s3c24xx/mach-tct_hammer.c | 2 +-
> arch/arm/mach-s3c24xx/mach-vr1000.c | 2 +-
> arch/arm/mach-s3c24xx/mach-vstms.c | 2 +-
> arch/arm/mach-s3c64xx/common.c | 19 +-
> arch/arm/mach-s3c64xx/include/mach/irqs.h | 8 -
> arch/arm/mach-s3c64xx/mach-anw6410.c | 2 +-
> arch/arm/mach-s3c64xx/mach-crag6410.c | 2 +-
> arch/arm/mach-s3c64xx/mach-hmt.c | 2 +-
> arch/arm/mach-s3c64xx/mach-mini6410.c | 2 +-
> arch/arm/mach-s3c64xx/mach-ncp.c | 2 +-
> arch/arm/mach-s3c64xx/mach-real6410.c | 2 +-
> arch/arm/mach-s3c64xx/mach-smartq.c | 2 +-
> arch/arm/mach-s3c64xx/mach-smartq5.c | 2 +-
> arch/arm/mach-s3c64xx/mach-smartq7.c | 2 +-
> arch/arm/mach-s3c64xx/mach-smdk6400.c | 2 +-
> arch/arm/mach-s3c64xx/mach-smdk6410.c | 2 +-
> arch/arm/mach-s5p64x0/common.c | 15 +
> arch/arm/mach-s5p64x0/include/mach/irqs.h | 2 -
> arch/arm/mach-s5p64x0/mach-smdk6440.c | 2 +-
> arch/arm/mach-s5p64x0/mach-smdk6450.c | 2 +-
> arch/arm/mach-s5pc100/common.c | 15 +
> arch/arm/mach-s5pc100/include/mach/irqs.h | 2 -
> arch/arm/mach-s5pc100/mach-smdkc100.c | 2 +-
> arch/arm/mach-s5pv210/common.c | 15 +
> arch/arm/mach-s5pv210/include/mach/irqs.h | 2 -
> arch/arm/mach-s5pv210/mach-aquila.c | 2 +-
> arch/arm/mach-s5pv210/mach-goni.c | 2 +-
> arch/arm/mach-s5pv210/mach-smdkc110.c | 2 +-
> arch/arm/mach-s5pv210/mach-smdkv210.c | 2 +-
> arch/arm/mach-s5pv210/mach-torbreck.c | 2 +-
> arch/arm/plat-samsung/Kconfig | 14 -
> arch/arm/plat-samsung/Makefile | 2 -
> arch/arm/plat-samsung/devs.c | 28 +-
> arch/arm/plat-samsung/include/plat/irq-vic-timer.h | 13 -
> arch/arm/plat-samsung/include/plat/irqs.h | 9 -
> arch/arm/plat-samsung/include/plat/samsung-time.h | 51 --
> arch/arm/plat-samsung/irq-vic-timer.c | 98 ----
> arch/arm/plat-samsung/s5p-irq.c | 3 -
> arch/arm/plat-samsung/samsung-time.c | 394 -------------
> drivers/clocksource/Kconfig | 7 +
> drivers/clocksource/Makefile | 1 +
> drivers/clocksource/samsung-time.c | 624
> +++++++++++++++++++++ include/linux/samsung-time.h
> | 44 ++
> 68 files changed, 847 insertions(+), 668 deletions(-)
> create mode 100644
> Documentation/devicetree/bindings/arm/samsung-timer.txt delete mode
> 100644 arch/arm/plat-samsung/include/plat/irq-vic-timer.h delete mode
> 100644 arch/arm/plat-samsung/include/plat/samsung-time.h delete mode
> 100644 arch/arm/plat-samsung/irq-vic-timer.c
> delete mode 100644 arch/arm/plat-samsung/samsung-time.c
> create mode 100644 drivers/clocksource/samsung-time.c
> create mode 100644 include/linux/samsung-time.h
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support
2013-02-10 13:32 ` [PATCH 00/12] ARM: samsung-time: Prepare for multiplatform support Tomasz Figa
@ 2013-02-10 14:12 ` Kyungmin Park
0 siblings, 0 replies; 20+ messages in thread
From: Kyungmin Park @ 2013-02-10 14:12 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Feb 10, 2013 at 10:32 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote:
> Seems like several mail addresses of board maintainers are no longer
> valid.
>
> guillaume.gourat at nexvision.tv
> mentioned in:
> arch/arm/mach-s3c24xx/mach-nexcoder.c
> arch/arm/mach-s3c24xx/mach-otom.c
>
> arhuaco at freaks-unidos.net
> mentioned in:
> arch/arm/mach-s3c24xx/mach-gta02.c
>
> danders at amltd.com
> mentioned in:
> arch/arm/mach-s3c24xx/mach-amlm5900.c
> arch/arm/mach-s3c24xx/mach-tct_hammer.c
>
> bhmin at samsung.com
> mentioned in:
> arch/arm/mach-s5pc100/mach-smdkc100
> and a bunch of files in arch/arm/mach-s5pc100
FYI: He's left the company. and he doesn't work it anymore, so you can drop him.
Thank you,
Kyungmin Park
>
> I wonder if we should do anything with them?
>
> Best regards,
> Tomasz
>
> On Sunday 10 of February 2013 14:20:11 Tomasz Figa wrote:
>> This series is an attempt to make the samsung-time clocksource driver
>> ready for multiplatform kernels. It moves the driver to
>> drivers/clocksource, cleans it up from uses of static platform-specific
>> definitions, simplifies timer interrupt handling and adds Device Tree
>> support.
>>
>> Tested on a Tiny6410 board (Mini6410-compatible) both with and without
>> Devicee Tree (with my DT patches for S3C64xx). Compile tested for other
>> related archs.
>>
>> Tomasz Figa (12):
>> ARM: SAMSUNG: Move samsung-time to drivers/clocksource
>> clocksource: samsung-time: Set platform-specific parameters at runtime
>> clocksource: samsung-time: Drop useless defines from public header
>> clocksource: samsung-time: Move samsung-time.h header to include/linux
>> clocksource: samsung-time: Use local register definitions
>> clocksource: samsung-time: Remove use of static register mapping
>> clocksource: samsung-time: Use clk_get_sys for getting clocks
>> ARM: SAMSUNG: devs: Drop unnecessary IRQ resources of timer devices
>> clocksource: samsung-time: Do not use static IRQ definition
>> clocksource: samsung-time: Move IRQ mask/ack handling to the driver
>> ARM: SAMSUNG: Remove unused PWM timer IRQ chip code
>> clocksource: samsung-time: Add Device Tree support
>>
>> .../devicetree/bindings/arm/samsung-timer.txt | 32 ++
>> arch/arm/Kconfig | 1 -
>> arch/arm/mach-exynos/include/mach/irqs.h | 3 +-
>> arch/arm/mach-exynos/mach-universal_c210.c | 15 +-
>> arch/arm/mach-s3c24xx/common.c | 14 +
>> arch/arm/mach-s3c24xx/mach-amlm5900.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-anubis.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-at2440evb.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-bast.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-gta02.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-h1940.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-jive.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-mini2440.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-n30.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-nexcoder.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-osiris.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-otom.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-qt2410.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-rx1950.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-rx3715.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-smdk2410.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-smdk2413.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-smdk2440.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-tct_hammer.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-vr1000.c | 2 +-
>> arch/arm/mach-s3c24xx/mach-vstms.c | 2 +-
>> arch/arm/mach-s3c64xx/common.c | 19 +-
>> arch/arm/mach-s3c64xx/include/mach/irqs.h | 8 -
>> arch/arm/mach-s3c64xx/mach-anw6410.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-crag6410.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-hmt.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-mini6410.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-ncp.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-real6410.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-smartq.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-smartq5.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-smartq7.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-smdk6400.c | 2 +-
>> arch/arm/mach-s3c64xx/mach-smdk6410.c | 2 +-
>> arch/arm/mach-s5p64x0/common.c | 15 +
>> arch/arm/mach-s5p64x0/include/mach/irqs.h | 2 -
>> arch/arm/mach-s5p64x0/mach-smdk6440.c | 2 +-
>> arch/arm/mach-s5p64x0/mach-smdk6450.c | 2 +-
>> arch/arm/mach-s5pc100/common.c | 15 +
>> arch/arm/mach-s5pc100/include/mach/irqs.h | 2 -
>> arch/arm/mach-s5pc100/mach-smdkc100.c | 2 +-
>> arch/arm/mach-s5pv210/common.c | 15 +
>> arch/arm/mach-s5pv210/include/mach/irqs.h | 2 -
>> arch/arm/mach-s5pv210/mach-aquila.c | 2 +-
>> arch/arm/mach-s5pv210/mach-goni.c | 2 +-
>> arch/arm/mach-s5pv210/mach-smdkc110.c | 2 +-
>> arch/arm/mach-s5pv210/mach-smdkv210.c | 2 +-
>> arch/arm/mach-s5pv210/mach-torbreck.c | 2 +-
>> arch/arm/plat-samsung/Kconfig | 14 -
>> arch/arm/plat-samsung/Makefile | 2 -
>> arch/arm/plat-samsung/devs.c | 28 +-
>> arch/arm/plat-samsung/include/plat/irq-vic-timer.h | 13 -
>> arch/arm/plat-samsung/include/plat/irqs.h | 9 -
>> arch/arm/plat-samsung/include/plat/samsung-time.h | 51 --
>> arch/arm/plat-samsung/irq-vic-timer.c | 98 ----
>> arch/arm/plat-samsung/s5p-irq.c | 3 -
>> arch/arm/plat-samsung/samsung-time.c | 394 -------------
>> drivers/clocksource/Kconfig | 7 +
>> drivers/clocksource/Makefile | 1 +
>> drivers/clocksource/samsung-time.c | 624
>> +++++++++++++++++++++ include/linux/samsung-time.h
>> | 44 ++
>> 68 files changed, 847 insertions(+), 668 deletions(-)
>> create mode 100644
>> Documentation/devicetree/bindings/arm/samsung-timer.txt delete mode
>> 100644 arch/arm/plat-samsung/include/plat/irq-vic-timer.h delete mode
>> 100644 arch/arm/plat-samsung/include/plat/samsung-time.h delete mode
>> 100644 arch/arm/plat-samsung/irq-vic-timer.c
>> delete mode 100644 arch/arm/plat-samsung/samsung-time.c
>> create mode 100644 drivers/clocksource/samsung-time.c
>> create mode 100644 include/linux/samsung-time.h
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 20+ messages in thread