Skip to contentSkip to conversation

sh: timer rewrite, base code

PATCH New Magnus Damm 1 participant 1 message Nov 21, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/8 sh: timer rewrite, base code

From: Magnus Damm <[email protected]>

New SuperH timer base code implementation supporting:
- hardware configuration kept with other processor parameters
- reentrant timer drivers using sysdev
- compile time CONFIG_SH_TIMER switch
- using CONFIG_GENERIC_TIME and CONFIG_GENERIC_CLOCKEVENTS
- sharing of drivers with other architectures

---

 arch/sh/Kconfig                |   12 +++++-
 arch/sh/kernel/time_32.c       |   34 +++++++++++--------
 drivers/clocksource/Makefile   |    1 
 drivers/clocksource/sh_timer.c |   69 ++++++++++++++++++++++++++++++++++++++++
 include/linux/sh_timer.h       |   44 +++++++++++++++++++++++++
 5 files changed, 143 insertions(+), 17 deletions(-)
arch/sh/Kconfig +9 -3
@@ -384,10 +384,15 @@ source "arch/sh/boards/Kconfig"
 
 menu "Timer and clock configuration"
 
+config SH_TIMER
+	def_bool n
+	select GENERIC_TIME
+	select GENERIC_CLOCKEVENTS
+
 config SH_TMU
 	def_bool y
 	prompt "TMU timer support"
-	depends on CPU_SH3 || CPU_SH4
+	depends on !SH_TIMER && (CPU_SH3 || CPU_SH4)
 	select GENERIC_TIME
 	select GENERIC_CLOCKEVENTS
 	help
@@ -396,18 +401,19 @@ config SH_TMU
 config SH_CMT
 	def_bool y
 	prompt "CMT timer support"
-	depends on CPU_SH2 && !CPU_SUBTYPE_MXG
+	depends on !SH_TIMER && CPU_SH2 && !CPU_SUBTYPE_MXG
 	help
 	  This enables the use of the CMT as the system timer.
 
 config SH_MTU2
 	def_bool n
 	prompt "MTU2 timer support"
-	depends on CPU_SH2A
+	depends on !SH_TIMER && CPU_SH2A
 	help
 	  This enables the use of the MTU2 as the system timer.
 
 config SH_TIMER_IRQ
+	depends on !SH_TIMER
 	int
 	default "28" if CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \
 			CPU_SUBTYPE_SH7763
arch/sh/kernel/time_32.c +20 -14
@@ -41,14 +41,6 @@ static int null_rtc_set_time(const time_
 	return 0;
 }
 
-/*
- * Null high precision timer functions for systems lacking one.
- */
-static cycle_t null_hpt_read(void)
-{
-	return 0;
-}
-
 void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
 int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
 
@@ -185,7 +177,7 @@ int timer_resume(struct sys_device *dev)
 #define timer_suspend NULL
 #define timer_resume NULL
 #endif
-
+#ifndef CONFIG_SH_TIMER
 static struct sysdev_class timer_sysclass = {
 	.name	 = "timer",
 	.suspend = timer_suspend,
@@ -202,17 +194,25 @@ static int __init timer_init_sysfs(void)
 	return sysdev_register(&sys_timer->dev);
 }
 device_initcall(timer_init_sysfs);
-
+#endif
 void (*board_time_init)(void);
 
 /*
  * Shamelessly based on the MIPS and Sparc64 work.
  */
-static unsigned long timer_ticks_per_nsec_quotient __read_mostly;
 unsigned long sh_hpt_frequency = 0;
-
+#ifndef CONFIG_SH_TIMER
+static unsigned long timer_ticks_per_nsec_quotient __read_mostly;
 #define NSEC_PER_CYC_SHIFT	10
 
+/*
+ * Null high precision timer functions for systems lacking one.
+ */
+static cycle_t null_hpt_read(void)
+{
+	return 0;
+}
+
 static struct clocksource clocksource_sh = {
 	.name		= "SuperH",
 	.rating		= 200,
@@ -221,9 +221,12 @@ static struct clocksource clocksource_sh
 	.shift		= 16,
 	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
 };
+#endif
+
 
 static void __init init_sh_clocksource(void)
 {
+#ifndef CONFIG_SH_TIMER
 	if (!sh_hpt_frequency || clocksource_sh.read = null_hpt_read)
 		return;
 
@@ -234,15 +237,18 @@ static void __init init_sh_clocksource(v
 		clocksource_hz2mult(sh_hpt_frequency, NSEC_PER_CYC_SHIFT);
 
 	clocksource_register(&clocksource_sh);
+#endif
 }
 
 #ifdef CONFIG_GENERIC_TIME
+#ifndef CONFIG_SH_TIMER
 unsigned long long sched_clock(void)
 {
 	unsigned long long ticks = clocksource_sh.read();
 	return (ticks * timer_ticks_per_nsec_quotient) >> NSEC_PER_CYC_SHIFT;
 }
 #endif
+#endif
 
 void __init time_init(void)
 {
@@ -258,7 +264,7 @@ void __init time_init(void)
 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
 	local_timer_setup(smp_processor_id());
 #endif
-
+#ifndef CONFIG_SH_TIMER
 	/*
 	 * Find the timer to use as the system timer, it will be
 	 * initialized for us.
@@ -269,6 +275,7 @@ void __init time_init(void)
 
 	if (sys_timer->ops->read)
 		clocksource_sh.read = sys_timer->ops->read;
+#endif
 
 	init_sh_clocksource();
 
@@ -276,7 +283,6 @@ void __init time_init(void)
 		printk("Using %lu.%03lu MHz high precision timer.\n",
 		       ((sh_hpt_frequency + 500) / 1000) / 1000,
 		       ((sh_hpt_frequency + 500) / 1000) % 1000);
-
 #if defined(CONFIG_SH_KGDB)
 	/*
 	 * Set up kgdb as requested. We do it here because the serial
drivers/clocksource/Makefile +1 -0
@@ -2,3 +2,4 @@ obj-$(CONFIG_ATMEL_TCB_CLKSRC)	+= tcb_cl
 obj-$(CONFIG_X86_CYCLONE_TIMER)	+= cyclone.o
 obj-$(CONFIG_X86_PM_TIMER)	+= acpi_pm.o
 obj-$(CONFIG_SCx200HR_TIMER)	+= scx200_hrt.o
+obj-$(CONFIG_SH_TIMER)		+= sh_timer.o
drivers/clocksource/sh_timer.c new file +69 -0

69 lines not on this page · raw message

include/linux/sh_timer.h new file +44 -0

44 lines not on this page · raw message