]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/clocksource/exynos_mct.c
Merge tag 'mct-exynos-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / clocksource / exynos_mct.c
index d3f1327d1ac4ce44344fc0e1c79e174ceaba0c09..957af8636c9d666f428a703eb4ff9bb465831cc0 100644 (file)
@@ -477,14 +477,14 @@ static struct local_timer_ops exynos4_mct_tick_ops __cpuinitdata = {
 };
 #endif /* CONFIG_LOCAL_TIMERS */
 
-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__);
 
@@ -503,38 +503,9 @@ static void __init exynos4_timer_resources(struct device_node *np)
 #endif /* CONFIG_LOCAL_TIMERS */
 }
 
-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)
 {
-       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;
@@ -543,9 +514,43 @@ void __init mct_init(void)
                panic("unable to determine mct controller type\n");
        }
 
-       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);
+
+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);