Merge tag 'cleanup-for-3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[cascardo/linux.git] / arch / arm / mach-exynos / exynos.c
index 66c9b96..3164ef2 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_domain.h>
+#include <linux/irqchip.h>
 
 #include <asm/cacheflush.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -29,6 +30,9 @@
 #include "common.h"
 #include "mfc.h"
 #include "regs-pmu.h"
+#include "regs-sys.h"
+
+void __iomem *pmu_base_addr;
 
 static struct map_desc exynos4_iodesc[] __initdata = {
        {
@@ -143,7 +147,7 @@ static struct map_desc exynos5_iodesc[] __initdata = {
        },
 };
 
-void exynos_restart(enum reboot_mode mode, const char *cmd)
+static void exynos_restart(enum reboot_mode mode, const char *cmd)
 {
        struct device_node *np;
        u32 val = 0x1;
@@ -204,7 +208,7 @@ void __init exynos_sysram_init(void)
        }
 }
 
-void __init exynos_init_late(void)
+static void __init exynos_init_late(void)
 {
        if (of_machine_is_compatible("samsung,exynos5440"))
                /* to be supported later */
@@ -251,7 +255,7 @@ static void __init exynos_map_io(void)
                iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
 }
 
-void __init exynos_init_io(void)
+static void __init exynos_init_io(void)
 {
        debug_ll_io_init();
 
@@ -263,6 +267,39 @@ void __init exynos_init_io(void)
        exynos_map_io();
 }
 
+static const struct of_device_id exynos_dt_pmu_match[] = {
+       { .compatible = "samsung,exynos3250-pmu" },
+       { .compatible = "samsung,exynos4210-pmu" },
+       { .compatible = "samsung,exynos4212-pmu" },
+       { .compatible = "samsung,exynos4412-pmu" },
+       { .compatible = "samsung,exynos5250-pmu" },
+       { .compatible = "samsung,exynos5420-pmu" },
+       { /*sentinel*/ },
+};
+
+static void exynos_map_pmu(void)
+{
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, exynos_dt_pmu_match);
+       if (np)
+               pmu_base_addr = of_iomap(np, 0);
+
+       if (!pmu_base_addr)
+               panic("failed to find exynos pmu register\n");
+}
+
+static void __init exynos_init_irq(void)
+{
+       irqchip_init();
+       /*
+        * Since platsmp.c needs pmu base address by the time
+        * DT is not unflatten so we can't use DT APIs before
+        * init_irq
+        */
+       exynos_map_pmu();
+}
+
 static void __init exynos_dt_machine_init(void)
 {
        struct device_node *i2c_np;
@@ -352,6 +389,7 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)")
        .smp            = smp_ops(exynos_smp_ops),
        .map_io         = exynos_init_io,
        .init_early     = exynos_firmware_init,
+       .init_irq       = exynos_init_irq,
        .init_machine   = exynos_dt_machine_init,
        .init_late      = exynos_init_late,
        .dt_compat      = exynos_dt_compat,