diff mbox

[1/1] ARM: EXYNOS: Add enable property to power domains

Message ID 1383806575-28401-1-git-send-email-sachin.kamat@linaro.org
State Superseded, archived
Headers show

Commit Message

Sachin Kamat Nov. 7, 2013, 6:42 a.m. UTC
From: Prathyush K <prathyush.k@samsung.com>

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@samsung.com>
Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
---
 .../bindings/arm/exynos/power_domain.txt           |    5 +++++
 arch/arm/mach-exynos/pm_domains.c                  |   10 +++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

Comments

Tomasz Figa Nov. 10, 2013, 7:06 p.m. UTC | #1
Hi Sachin,

On Thursday 07 of November 2013 12:12:55 Sachin Kamat wrote:
> From: Prathyush K <prathyush.k@samsung.com>
> 
> 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.

Is this patch really needed? Is there any problem with simply using 0x7?
Patch description should always include rationale behind the change.

> 
> Signed-off-by: Prathyush K <prathyush.k@samsung.com>
> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
> ---
>  .../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.

Vendor-specific properties should have vendor prefix added, so this one
should be called samsung,enable instead. Also enable is not a very
specific name.

So in the end, if it turns out that we really need such patch, I'd prefer
something like:

- samsung,enable-bit-mask: Mask of power control register bits that need
    to be set to enable the power domain. If omitted, it defaults to 0x7.

Best regards,
Tomasz

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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);
 	}