ARM: EXYNOS: Detect power domain state on registration from DT
authorTomasz Figa <t.figa@samsung.com>
Wed, 21 Nov 2012 15:21:08 +0000 (00:21 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Wed, 21 Nov 2012 15:38:57 +0000 (00:38 +0900)
Initial state of power domains might vary on different boards and with
different bootloaders.

This patch adds detection of initial state of power domains when being
registered from DT.

Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Documentation/devicetree/bindings/arm/exynos/power_domain.txt
arch/arm/mach-exynos/pm_domains.c

index 6528e215c5fe54e3c7e74ba2f909342e3773b635..843b54622313670984d6d7cbd62fe05ae8ef27ed 100644 (file)
@@ -9,10 +9,6 @@ Required Properties:
 - reg: physical base address of the controller and length of memory mapped
     region.
 
-Optional Properties:
-- samsung,exynos4210-pd-off: Specifies that the power domain is in turned-off
-    state during boot and remains to be turned-off until explicitly turned-on.
-
 Example:
 
        lcd0: power-domain-lcd0 {
index c0bc83a7663ee5877edfc0ff768b63a1ed1a2e30..d1abc1a94ecd519f5cb4253c4741a09fc68c2f5d 100644 (file)
@@ -89,6 +89,7 @@ static __init int exynos_pm_dt_parse_domains(void)
 
        for_each_compatible_node(np, NULL, "samsung,exynos4210-pd") {
                struct exynos_pm_domain *pd;
+               int on;
 
                pd = kzalloc(sizeof(*pd), GFP_KERNEL);
                if (!pd) {
@@ -97,14 +98,15 @@ static __init int exynos_pm_dt_parse_domains(void)
                        return -ENOMEM;
                }
 
-               if (of_get_property(np, "samsung,exynos4210-pd-off", NULL))
-                       pd->is_off = true;
                pd->name = np->name;
                pd->base = of_iomap(np, 0);
                pd->pd.power_off = exynos_pd_power_off;
                pd->pd.power_on = exynos_pd_power_on;
                pd->pd.of_node = np;
-               pm_genpd_init(&pd->pd, NULL, false);
+
+               on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;
+
+               pm_genpd_init(&pd->pd, NULL, !on);
        }
        return 0;
 }