diff options
Diffstat (limited to 'arch/arm/plat-s5p/s5p-time.c')
-rw-r--r-- | arch/arm/plat-s5p/s5p-time.c | 58 |
1 files changed, 17 insertions, 41 deletions
diff --git a/arch/arm/plat-s5p/s5p-time.c b/arch/arm/plat-s5p/s5p-time.c index 8090403eec0f..899a8cc011ff 100644 --- a/arch/arm/plat-s5p/s5p-time.c +++ b/arch/arm/plat-s5p/s5p-time.c | |||
@@ -290,7 +290,7 @@ static void __init s5p_clockevent_init(void) | |||
290 | setup_irq(irq_number, &s5p_clock_event_irq); | 290 | setup_irq(irq_number, &s5p_clock_event_irq); |
291 | } | 291 | } |
292 | 292 | ||
293 | static cycle_t s5p_timer_read(struct clocksource *cs) | 293 | static void __iomem *s5p_timer_reg(void) |
294 | { | 294 | { |
295 | unsigned long offset = 0; | 295 | unsigned long offset = 0; |
296 | 296 | ||
@@ -308,10 +308,17 @@ static cycle_t s5p_timer_read(struct clocksource *cs) | |||
308 | 308 | ||
309 | default: | 309 | default: |
310 | printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id); | 310 | printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id); |
311 | return 0; | 311 | return NULL; |
312 | } | 312 | } |
313 | 313 | ||
314 | return (cycle_t) ~__raw_readl(S3C_TIMERREG(offset)); | 314 | return S3C_TIMERREG(offset); |
315 | } | ||
316 | |||
317 | static cycle_t s5p_timer_read(struct clocksource *cs) | ||
318 | { | ||
319 | void __iomem *reg = s5p_timer_reg(); | ||
320 | |||
321 | return (cycle_t) (reg ? ~__raw_readl(reg) : 0); | ||
315 | } | 322 | } |
316 | 323 | ||
317 | /* | 324 | /* |
@@ -325,53 +332,22 @@ static DEFINE_CLOCK_DATA(cd); | |||
325 | 332 | ||
326 | unsigned long long notrace sched_clock(void) | 333 | unsigned long long notrace sched_clock(void) |
327 | { | 334 | { |
328 | u32 cyc; | 335 | void __iomem *reg = s5p_timer_reg(); |
329 | unsigned long offset = 0; | ||
330 | |||
331 | switch (timer_source.source_id) { | ||
332 | case S5P_PWM0: | ||
333 | case S5P_PWM1: | ||
334 | case S5P_PWM2: | ||
335 | case S5P_PWM3: | ||
336 | offset = (timer_source.source_id * 0x0c) + 0x14; | ||
337 | break; | ||
338 | |||
339 | case S5P_PWM4: | ||
340 | offset = 0x40; | ||
341 | break; | ||
342 | 336 | ||
343 | default: | 337 | if (!reg) |
344 | printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id); | ||
345 | return 0; | 338 | return 0; |
346 | } | ||
347 | 339 | ||
348 | cyc = ~__raw_readl(S3C_TIMERREG(offset)); | 340 | return cyc_to_sched_clock(&cd, ~__raw_readl(reg), (u32)~0); |
349 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
350 | } | 341 | } |
351 | 342 | ||
352 | static void notrace s5p_update_sched_clock(void) | 343 | static void notrace s5p_update_sched_clock(void) |
353 | { | 344 | { |
354 | u32 cyc; | 345 | void __iomem *reg = s5p_timer_reg(); |
355 | unsigned long offset = 0; | ||
356 | 346 | ||
357 | switch (timer_source.source_id) { | 347 | if (!reg) |
358 | case S5P_PWM0: | 348 | return; |
359 | case S5P_PWM1: | ||
360 | case S5P_PWM2: | ||
361 | case S5P_PWM3: | ||
362 | offset = (timer_source.source_id * 0x0c) + 0x14; | ||
363 | break; | ||
364 | |||
365 | case S5P_PWM4: | ||
366 | offset = 0x40; | ||
367 | break; | ||
368 | |||
369 | default: | ||
370 | printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id); | ||
371 | } | ||
372 | 349 | ||
373 | cyc = ~__raw_readl(S3C_TIMERREG(offset)); | 350 | update_sched_clock(&cd, ~__raw_readl(reg), (u32)~0); |
374 | update_sched_clock(&cd, cyc, (u32)~0); | ||
375 | } | 351 | } |
376 | 352 | ||
377 | struct clocksource time_clocksource = { | 353 | struct clocksource time_clocksource = { |