soc: renesas: rcar-sysc: Make rcar_sysc_init() init the PM domains
authorGeert Uytterhoeven <geert+renesas@glider.be>
Tue, 28 Jun 2016 14:10:32 +0000 (16:10 +0200)
committerSimon Horman <horms+renesas@verge.net.au>
Wed, 29 Jun 2016 12:36:51 +0000 (14:36 +0200)
Let rcar_sysc_init() trigger initialization of the SYSC PM domains from
DT if called before the early_initcall.
On failure, it falls back to mapping the passed register block, as
before.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
drivers/soc/renesas/rcar-sysc.c

index 59a8152681a59a5c1ed46963b925921ec9347804..68d6856c9d3cd19264905d83e7c5bb2251669e23 100644 (file)
@@ -164,15 +164,6 @@ static bool rcar_sysc_power_is_off(const struct rcar_sysc_ch *sysc_ch)
        return false;
 }
 
-void __iomem *rcar_sysc_init(phys_addr_t base)
-{
-       rcar_sysc_base = ioremap_nocache(base, PAGE_SIZE);
-       if (!rcar_sysc_base)
-               panic("unable to ioremap R-Car SYSC hardware block\n");
-
-       return rcar_sysc_base;
-}
-
 struct rcar_sysc_pd {
        struct generic_pm_domain genpd;
        struct rcar_sysc_ch ch;
@@ -328,6 +319,9 @@ static int __init rcar_sysc_pd_init(void)
        unsigned int i;
        int error;
 
+       if (rcar_sysc_base)
+               return 0;
+
        np = of_find_matching_node_and_match(NULL, rcar_sysc_matches, &match);
        if (!np)
                return -ENODEV;
@@ -405,3 +399,11 @@ out_put:
        return error;
 }
 early_initcall(rcar_sysc_pd_init);
+
+void __iomem * __init rcar_sysc_init(phys_addr_t base)
+{
+       if (rcar_sysc_pd_init())
+               rcar_sysc_base = ioremap_nocache(base, PAGE_SIZE);
+
+       return rcar_sysc_base;
+}