};
  #endif /* CONFIG_LOCAL_TIMERS */
  
- static void __init exynos4_timer_resources(void)
 -static void __init exynos4_timer_resources(struct device_node *np)
++static void __init exynos4_timer_resources(void __iomem *base)
  {
        struct clk *mct_clk;
        mct_clk = clk_get(NULL, "xtal");
  
        clk_rate = clk_get_rate(mct_clk);
  
 -      reg_base = np ? of_iomap(np, 0) : S5P_VA_SYSTIMER;
++      reg_base = base;
+       if (!reg_base)
+               panic("%s: unable to ioremap mct address space\n", __func__);
+ 
  #ifdef CONFIG_LOCAL_TIMERS
        if (mct_int_type == MCT_INT_PPI) {
                int err;
  #endif /* CONFIG_LOCAL_TIMERS */
  }
  
- void __init exynos4_timer_init(void)
 -static const struct of_device_id exynos_mct_ids[] = {
 -      { .compatible = "samsung,exynos4210-mct", .data = (void *)MCT_INT_SPI },
 -      { .compatible = "samsung,exynos4412-mct", .data = (void *)MCT_INT_PPI },
 -      { }
 -};
 -
+ void __init mct_init(void)
  {
-       if (soc_is_exynos5440()) {
-               arch_timer_of_register();
-               return;
 -      struct device_node *np = NULL;
 -      const struct of_device_id *match;
 -      u32 nr_irqs, i;
 -
 -#ifdef CONFIG_OF
 -      np = of_find_matching_node_and_match(NULL, exynos_mct_ids, &match);
 -#endif
 -      if (np) {
 -              mct_int_type = (u32)(match->data);
 -
 -              /* This driver uses only one global timer interrupt */
 -              mct_irqs[MCT_G0_IRQ] = irq_of_parse_and_map(np, MCT_G0_IRQ);
 -
 -              /*
 -               * Find out the number of local irqs specified. The local
 -               * timer irqs are specified after the four global timer
 -               * irqs are specified.
 -               */
 -#ifdef CONFIG_OF
 -              nr_irqs = of_irq_count(np);
 -#endif
 -              for (i = MCT_L0_IRQ; i < nr_irqs; i++)
 -                      mct_irqs[i] = irq_of_parse_and_map(np, i);
 -      } else if (soc_is_exynos4210()) {
++      if (soc_is_exynos4210()) {
+               mct_irqs[MCT_G0_IRQ] = EXYNOS4_IRQ_MCT_G0;
+               mct_irqs[MCT_L0_IRQ] = EXYNOS4_IRQ_MCT_L0;
+               mct_irqs[MCT_L1_IRQ] = EXYNOS4_IRQ_MCT_L1;
+               mct_int_type = MCT_INT_SPI;
+       } else {
+               panic("unable to determine mct controller type\n");
        }
  
-       if ((soc_is_exynos4210()) || (soc_is_exynos5250()))
-               mct_int_type = MCT_INT_SPI;
-       else
-               mct_int_type = MCT_INT_PPI;
 -      exynos4_timer_resources(np);
++      exynos4_timer_resources(S5P_VA_SYSTIMER);
+       exynos4_clocksource_init();
+       exynos4_clockevent_init();
+ }
 -CLOCKSOURCE_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init);
 -CLOCKSOURCE_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init);
 +
-       exynos4_timer_resources();
++static void __init mct_init_dt(struct device_node *np, unsigned int int_type)
++{
++      u32 nr_irqs, i;
++
++      mct_int_type = int_type;
++
++      /* This driver uses only one global timer interrupt */
++      mct_irqs[MCT_G0_IRQ] = irq_of_parse_and_map(np, MCT_G0_IRQ);
++
++      /*
++       * Find out the number of local irqs specified. The local
++       * timer irqs are specified after the four global timer
++       * irqs are specified.
++       */
++      nr_irqs = of_irq_count(np);
++      for (i = MCT_L0_IRQ; i < nr_irqs; i++)
++              mct_irqs[i] = irq_of_parse_and_map(np, i);
++
++      exynos4_timer_resources(of_iomap(np, 0));
 +      exynos4_clocksource_init();
 +      exynos4_clockevent_init();
 +}
++
++
++static void __init mct_init_spi(struct device_node *np)
++{
++      return mct_init_dt(np, MCT_INT_SPI);
++}
++
++static void __init mct_init_ppi(struct device_node *np)
++{
++      return mct_init_dt(np, MCT_INT_PPI);
++}
++CLOCKSOURCE_OF_DECLARE(exynos4210, "samsung,exynos4210-mct", mct_init_spi);
++CLOCKSOURCE_OF_DECLARE(exynos4412, "samsung,exynos4412-mct", mct_init_ppi);