From: Prathyush K <prathyush.k@xxxxxxxxxxx> Different power domains of Exynos SOCs have different enable values. E.g. Exynos5250: ROTATOR_MEM_CONFIGURATION -> 0x3 GSCL_CONFIGURATION -> 0x7 Currently, there is no way to differentiate between these power domains and we write default value of 0x7 to turn on all the power domains. This patch adds a new 'enable' property to the power domain structure. This enable value can be set from the device tree by adding a property 'enable' in the device node. If no such property is found, the default value of 0x7 is used as enable value. Signed-off-by: Prathyush K <prathyush.k@xxxxxxxxxxx> Signed-off-by: Sachin Kamat <sachin.kamat@xxxxxxxxxx> --- .../bindings/arm/exynos/power_domain.txt | 5 +++++ arch/arm/mach-exynos/pm_domains.c | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt index 5216b419016a..6b24b234617c 100644 --- a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt +++ b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt @@ -9,6 +9,10 @@ Required Properties: - reg: physical base address of the controller and length of memory mapped region. +Optional Properties: +- enable: enable value of the register which is used to turn on the power + domain. If no enable is specificed, default value of 0x7 is used. + Node of a device using power domains must have a samsung,power-domain property defined with a phandle to respective power domain. @@ -17,6 +21,7 @@ Example: lcd0: power-domain-lcd0 { compatible = "samsung,exynos4210-pd"; reg = <0x10023C00 0x10>; + enable = <0x1>; }; Example of the node using power domain: diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index 1703593e366c..84e0483a0500 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c @@ -33,6 +33,7 @@ struct exynos_pm_domain { char const *name; bool is_off; struct generic_pm_domain pd; + u32 enable; }; static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on) @@ -45,13 +46,13 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on) pd = container_of(domain, struct exynos_pm_domain, pd); base = pd->base; - pwr = power_on ? S5P_INT_LOCAL_PWR_EN : 0; + pwr = power_on ? pd->enable : 0; __raw_writel(pwr, base); /* Wait max 1ms */ timeout = 10; - while ((__raw_readl(base + 0x4) & S5P_INT_LOCAL_PWR_EN) != pwr) { + while ((__raw_readl(base + 0x4) & pd->enable) != pwr) { if (!timeout) { op = (power_on) ? "enable" : "disable"; pr_err("Power domain %s %s failed\n", domain->name, op); @@ -164,6 +165,9 @@ static __init int exynos4_pm_init_power_domain(void) return -ENOMEM; } + if (of_property_read_u32(np, "enable", &pd->enable)) + pd->enable = S5P_INT_LOCAL_PWR_EN; + pd->pd.name = kstrdup(np->name, GFP_KERNEL); pd->name = pd->pd.name; pd->base = of_iomap(np, 0); @@ -173,7 +177,7 @@ static __init int exynos4_pm_init_power_domain(void) platform_set_drvdata(pdev, pd); - on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN; + on = __raw_readl(pd->base + 0x4) & pd->enable; pm_genpd_init(&pd->pd, NULL, !on); } -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html