diff options
Diffstat (limited to 'arch/sh/kernel/time_32.c')
| -rw-r--r-- | arch/sh/kernel/time_32.c | 71 |
1 files changed, 18 insertions, 53 deletions
diff --git a/arch/sh/kernel/time_32.c b/arch/sh/kernel/time_32.c index 8457f83242c5..c34e1e0f9b02 100644 --- a/arch/sh/kernel/time_32.c +++ b/arch/sh/kernel/time_32.c | |||
| @@ -41,14 +41,6 @@ static int null_rtc_set_time(const time_t secs) | |||
| 41 | return 0; | 41 | return 0; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | /* | ||
| 45 | * Null high precision timer functions for systems lacking one. | ||
| 46 | */ | ||
| 47 | static cycle_t null_hpt_read(void) | ||
| 48 | { | ||
| 49 | return 0; | ||
| 50 | } | ||
| 51 | |||
| 52 | void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; | 44 | void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; |
| 53 | int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; | 45 | int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; |
| 54 | 46 | ||
| @@ -112,7 +104,6 @@ int do_settimeofday(struct timespec *tv) | |||
| 112 | EXPORT_SYMBOL(do_settimeofday); | 104 | EXPORT_SYMBOL(do_settimeofday); |
| 113 | #endif /* !CONFIG_GENERIC_TIME */ | 105 | #endif /* !CONFIG_GENERIC_TIME */ |
| 114 | 106 | ||
| 115 | #ifndef CONFIG_GENERIC_CLOCKEVENTS | ||
| 116 | /* last time the RTC clock got updated */ | 107 | /* last time the RTC clock got updated */ |
| 117 | static long last_rtc_update; | 108 | static long last_rtc_update; |
| 118 | 109 | ||
| @@ -156,7 +147,6 @@ void handle_timer_tick(void) | |||
| 156 | update_process_times(user_mode(get_irq_regs())); | 147 | update_process_times(user_mode(get_irq_regs())); |
| 157 | #endif | 148 | #endif |
| 158 | } | 149 | } |
| 159 | #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ | ||
| 160 | 150 | ||
| 161 | #ifdef CONFIG_PM | 151 | #ifdef CONFIG_PM |
| 162 | int timer_suspend(struct sys_device *dev, pm_message_t state) | 152 | int timer_suspend(struct sys_device *dev, pm_message_t state) |
| @@ -189,7 +179,12 @@ static struct sysdev_class timer_sysclass = { | |||
| 189 | 179 | ||
| 190 | static int __init timer_init_sysfs(void) | 180 | static int __init timer_init_sysfs(void) |
| 191 | { | 181 | { |
| 192 | int ret = sysdev_class_register(&timer_sysclass); | 182 | int ret; |
| 183 | |||
| 184 | if (!sys_timer) | ||
| 185 | return 0; | ||
| 186 | |||
| 187 | ret = sysdev_class_register(&timer_sysclass); | ||
| 193 | if (ret != 0) | 188 | if (ret != 0) |
| 194 | return ret; | 189 | return ret; |
| 195 | 190 | ||
| @@ -200,42 +195,21 @@ device_initcall(timer_init_sysfs); | |||
| 200 | 195 | ||
| 201 | void (*board_time_init)(void); | 196 | void (*board_time_init)(void); |
| 202 | 197 | ||
| 203 | /* | 198 | struct clocksource clocksource_sh = { |
| 204 | * Shamelessly based on the MIPS and Sparc64 work. | ||
| 205 | */ | ||
| 206 | static unsigned long timer_ticks_per_nsec_quotient __read_mostly; | ||
| 207 | unsigned long sh_hpt_frequency = 0; | ||
| 208 | |||
| 209 | #define NSEC_PER_CYC_SHIFT 10 | ||
| 210 | |||
| 211 | static struct clocksource clocksource_sh = { | ||
| 212 | .name = "SuperH", | 199 | .name = "SuperH", |
| 213 | .rating = 200, | ||
| 214 | .mask = CLOCKSOURCE_MASK(32), | ||
| 215 | .read = null_hpt_read, | ||
| 216 | .shift = 16, | ||
| 217 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
| 218 | }; | 200 | }; |
| 219 | 201 | ||
| 220 | static void __init init_sh_clocksource(void) | ||
| 221 | { | ||
| 222 | if (!sh_hpt_frequency || clocksource_sh.read == null_hpt_read) | ||
| 223 | return; | ||
| 224 | |||
| 225 | clocksource_sh.mult = clocksource_hz2mult(sh_hpt_frequency, | ||
| 226 | clocksource_sh.shift); | ||
| 227 | |||
| 228 | timer_ticks_per_nsec_quotient = | ||
| 229 | clocksource_hz2mult(sh_hpt_frequency, NSEC_PER_CYC_SHIFT); | ||
| 230 | |||
| 231 | clocksource_register(&clocksource_sh); | ||
| 232 | } | ||
| 233 | |||
| 234 | #ifdef CONFIG_GENERIC_TIME | 202 | #ifdef CONFIG_GENERIC_TIME |
| 235 | unsigned long long sched_clock(void) | 203 | unsigned long long sched_clock(void) |
| 236 | { | 204 | { |
| 237 | unsigned long long ticks = clocksource_sh.read(); | 205 | unsigned long long cycles; |
| 238 | return (ticks * timer_ticks_per_nsec_quotient) >> NSEC_PER_CYC_SHIFT; | 206 | |
| 207 | /* jiffies based sched_clock if no clocksource is installed */ | ||
| 208 | if (!clocksource_sh.rating) | ||
| 209 | return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ); | ||
| 210 | |||
| 211 | cycles = clocksource_sh.read(); | ||
| 212 | return cyc2ns(&clocksource_sh, cycles); | ||
| 239 | } | 213 | } |
| 240 | #endif | 214 | #endif |
| 241 | 215 | ||
| @@ -259,17 +233,8 @@ void __init time_init(void) | |||
| 259 | * initialized for us. | 233 | * initialized for us. |
| 260 | */ | 234 | */ |
| 261 | sys_timer = get_sys_timer(); | 235 | sys_timer = get_sys_timer(); |
| 262 | printk(KERN_INFO "Using %s for system timer\n", sys_timer->name); | 236 | if (unlikely(!sys_timer)) |
| 263 | 237 | panic("System timer missing.\n"); | |
| 264 | |||
| 265 | if (sys_timer->ops->read) | ||
| 266 | clocksource_sh.read = sys_timer->ops->read; | ||
| 267 | |||
| 268 | init_sh_clocksource(); | ||
| 269 | |||
| 270 | if (sh_hpt_frequency) | ||
| 271 | printk("Using %lu.%03lu MHz high precision timer.\n", | ||
| 272 | ((sh_hpt_frequency + 500) / 1000) / 1000, | ||
| 273 | ((sh_hpt_frequency + 500) / 1000) % 1000); | ||
| 274 | 238 | ||
| 239 | printk(KERN_INFO "Using %s for system timer\n", sys_timer->name); | ||
| 275 | } | 240 | } |
