aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/clocksource/samsung_pwm_timer.c33
1 files changed, 8 insertions, 25 deletions
diff --git a/drivers/clocksource/samsung_pwm_timer.c b/drivers/clocksource/samsung_pwm_timer.c
index 5d0049f07af4..0c005f4fa296 100644
--- a/drivers/clocksource/samsung_pwm_timer.c
+++ b/drivers/clocksource/samsung_pwm_timer.c
@@ -65,6 +65,7 @@ EXPORT_SYMBOL(samsung_pwm_lock);
65 65
66struct samsung_pwm_clocksource { 66struct samsung_pwm_clocksource {
67 void __iomem *base; 67 void __iomem *base;
68 void __iomem *source_reg;
68 unsigned int irq[SAMSUNG_PWM_NUM]; 69 unsigned int irq[SAMSUNG_PWM_NUM];
69 struct samsung_pwm_variant variant; 70 struct samsung_pwm_variant variant;
70 71
@@ -297,23 +298,6 @@ static void __init samsung_clockevent_init(void)
297 } 298 }
298} 299}
299 300
300static void __iomem *samsung_timer_reg(void)
301{
302 switch (pwm.source_id) {
303 case 0:
304 case 1:
305 case 2:
306 case 3:
307 return pwm.base + pwm.source_id * 0x0c + 0x14;
308
309 case 4:
310 return pwm.base + 0x40;
311
312 default:
313 BUG();
314 }
315}
316
317/* 301/*
318 * Override the global weak sched_clock symbol with this 302 * Override the global weak sched_clock symbol with this
319 * local implementation which uses the clocksource to get some 303 * local implementation which uses the clocksource to get some
@@ -323,17 +307,11 @@ static void __iomem *samsung_timer_reg(void)
323 */ 307 */
324static u32 notrace samsung_read_sched_clock(void) 308static u32 notrace samsung_read_sched_clock(void)
325{ 309{
326 void __iomem *reg = samsung_timer_reg(); 310 return ~__raw_readl(pwm.source_reg);
327
328 if (!reg)
329 return 0;
330
331 return ~__raw_readl(reg);
332} 311}
333 312
334static void __init samsung_clocksource_init(void) 313static void __init samsung_clocksource_init(void)
335{ 314{
336 void __iomem *reg = samsung_timer_reg();
337 unsigned long pclk; 315 unsigned long pclk;
338 unsigned long clock_rate; 316 unsigned long clock_rate;
339 int ret; 317 int ret;
@@ -348,10 +326,15 @@ static void __init samsung_clocksource_init(void)
348 samsung_time_setup(pwm.source_id, pwm.tcnt_max); 326 samsung_time_setup(pwm.source_id, pwm.tcnt_max);
349 samsung_time_start(pwm.source_id, true); 327 samsung_time_start(pwm.source_id, true);
350 328
329 if (pwm.source_id == 4)
330 pwm.source_reg = pwm.base + 0x40;
331 else
332 pwm.source_reg = pwm.base + pwm.source_id * 0x0c + 0x14;
333
351 setup_sched_clock(samsung_read_sched_clock, 334 setup_sched_clock(samsung_read_sched_clock,
352 pwm.variant.bits, clock_rate); 335 pwm.variant.bits, clock_rate);
353 336
354 ret = clocksource_mmio_init(reg, "samsung_clocksource_timer", 337 ret = clocksource_mmio_init(pwm.source_reg, "samsung_clocksource_timer",
355 clock_rate, 250, pwm.variant.bits, 338 clock_rate, 250, pwm.variant.bits,
356 clocksource_mmio_readl_down); 339 clocksource_mmio_readl_down);
357 if (ret) 340 if (ret)