ARM: EXYNOS: register power domain driver from core_initcall
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 3 Jun 2015 23:09:27 +0000 (08:09 +0900)
committerKukjin Kim <kgene@kernel.org>
Fri, 5 Jun 2015 17:18:03 +0000 (02:18 +0900)
SYSMMU devices are registered very early in arch_initcall, so ensure
that they can get access to power domains by registering power domain
driver from earlier initcall. This change requires dropping usage of
the platform device associated with each power domain and replacing
clock calls with respective of_clk_* equivalents.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: Kukjin Kim <kgene@kernel.org>
arch/arm/mach-exynos/pm_domains.c

index 1639645bddeb516625a39373b1279e57ee047f40..6001f1c9d136f45fabd7d61e97638855d0beb46a 100644 (file)
@@ -121,22 +121,11 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain)
 
 static __init int exynos4_pm_init_power_domain(void)
 {
-       struct platform_device *pdev;
        struct device_node *np;
 
        for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") {
                struct exynos_pm_domain *pd;
                int on, i;
-               struct device *dev;
-
-               pdev = of_find_device_by_node(np);
-               if (!pdev) {
-                       pr_err("%s: failed to find device for node %s\n",
-                                       __func__, np->name);
-                       of_node_put(np);
-                       continue;
-               }
-               dev = &pdev->dev;
 
                pd = kzalloc(sizeof(*pd), GFP_KERNEL);
                if (!pd) {
@@ -145,8 +134,8 @@ static __init int exynos4_pm_init_power_domain(void)
                        of_node_put(np);
                        return -ENOMEM;
                }
-
-               pd->pd.name = kstrdup(dev_name(dev), GFP_KERNEL);
+               pd->pd.name = kstrdup_const(strrchr(np->full_name, '/') + 1,
+                                           GFP_KERNEL);
                if (!pd->pd.name) {
                        kfree(pd);
                        of_node_put(np);
@@ -156,7 +145,7 @@ static __init int exynos4_pm_init_power_domain(void)
                pd->name = pd->pd.name;
                pd->base = of_iomap(np, 0);
                if (!pd->base) {
-                       dev_warn(&pdev->dev, "Failed to map memory\n");
+                       pr_warn("%s: failed to map memory\n", __func__);
                        kfree(pd->pd.name);
                        kfree(pd);
                        of_node_put(np);
@@ -170,12 +159,12 @@ static __init int exynos4_pm_init_power_domain(void)
                        char clk_name[8];
 
                        snprintf(clk_name, sizeof(clk_name), "asb%d", i);
-                       pd->asb_clk[i] = clk_get(dev, clk_name);
+                       pd->asb_clk[i] = of_clk_get_by_name(np, clk_name);
                        if (IS_ERR(pd->asb_clk[i]))
                                break;
                }
 
-               pd->oscclk = clk_get(dev, "oscclk");
+               pd->oscclk = of_clk_get_by_name(np, "oscclk");
                if (IS_ERR(pd->oscclk))
                        goto no_clk;
 
@@ -183,7 +172,7 @@ static __init int exynos4_pm_init_power_domain(void)
                        char clk_name[8];
 
                        snprintf(clk_name, sizeof(clk_name), "clk%d", i);
-                       pd->clk[i] = clk_get(dev, clk_name);
+                       pd->clk[i] = of_clk_get_by_name(np, clk_name);
                        if (IS_ERR(pd->clk[i]))
                                break;
                        /*
@@ -234,4 +223,4 @@ next_pd:
 
        return 0;
 }
-arch_initcall(exynos4_pm_init_power_domain);
+core_initcall(exynos4_pm_init_power_domain);