struct samsung_pwm_clocksource {
        void __iomem *base;
+       void __iomem *source_reg;
        unsigned int irq[SAMSUNG_PWM_NUM];
        struct samsung_pwm_variant variant;
 
        }
 }
 
-static void __iomem *samsung_timer_reg(void)
-{
-       switch (pwm.source_id) {
-       case 0:
-       case 1:
-       case 2:
-       case 3:
-               return pwm.base + pwm.source_id * 0x0c + 0x14;
-
-       case 4:
-               return pwm.base + 0x40;
-
-       default:
-               BUG();
-       }
-}
-
 /*
  * Override the global weak sched_clock symbol with this
  * local implementation which uses the clocksource to get some
  */
 static u32 notrace samsung_read_sched_clock(void)
 {
-       void __iomem *reg = samsung_timer_reg();
-
-       if (!reg)
-               return 0;
-
-       return ~__raw_readl(reg);
+       return ~__raw_readl(pwm.source_reg);
 }
 
 static void __init samsung_clocksource_init(void)
 {
-       void __iomem *reg = samsung_timer_reg();
        unsigned long pclk;
        unsigned long clock_rate;
        int ret;
        samsung_time_setup(pwm.source_id, pwm.tcnt_max);
        samsung_time_start(pwm.source_id, true);
 
+       if (pwm.source_id == 4)
+               pwm.source_reg = pwm.base + 0x40;
+       else
+               pwm.source_reg = pwm.base + pwm.source_id * 0x0c + 0x14;
+
        setup_sched_clock(samsung_read_sched_clock,
                                                pwm.variant.bits, clock_rate);
 
-       ret = clocksource_mmio_init(reg, "samsung_clocksource_timer",
+       ret = clocksource_mmio_init(pwm.source_reg, "samsung_clocksource_timer",
                                        clock_rate, 250, pwm.variant.bits,
                                        clocksource_mmio_readl_down);
        if (ret)