diff options
| -rw-r--r-- | drivers/clocksource/samsung_pwm_timer.c | 33 |
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 | ||
| 66 | struct samsung_pwm_clocksource { | 66 | struct 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 | ||
| 300 | static 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 | */ |
| 324 | static u32 notrace samsung_read_sched_clock(void) | 308 | static 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 | ||
| 334 | static void __init samsung_clocksource_init(void) | 313 | static 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) |
