All of lore.kernel.org
 help / color / mirror / Atom feed
From: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
To: Krzysztof Kozlowski <k.kozlowski@samsung.com>,
	Kukjin Kim <kgene@kernel.org>,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Subject: Re: [PATCH 1/2] ARM: EXYNOS: Get current parent clock for power domain on/off
Date: Thu, 02 Apr 2015 14:29:31 +0200	[thread overview]
Message-ID: <551D362B.90901@collabora.co.uk> (raw)
In-Reply-To: <1427961979-29477-1-git-send-email-k.kozlowski@samsung.com>

Hello Krzysztof,

On 04/02/2015 10:06 AM, Krzysztof Kozlowski wrote:
> Using a fixed (by DTS) parent for clocks when turning on the power domain
> may introduce issues in other drivers. For example when such driver
> changes the parent during runtime and expects that he is the only place
> of such change.
> 
> Do not rely entirely on DTS providing the fixed parent for such clocks.
> Instead if "pclkN" clock name is missing, grab a current parent of clock
> with clk_get_parent().
> 
> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> ---
>  Documentation/devicetree/bindings/arm/exynos/power_domain.txt | 8 +++++---
>  arch/arm/mach-exynos/pm_domains.c                             | 9 ++++++---
>  2 files changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> index 5da38c5ed476..0fc1312f6fd5 100644
> --- a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> +++ b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> @@ -19,9 +19,11 @@ Optional Properties:
>  	domains.
>  - clock-names: The following clocks can be specified:
>  	- oscclk: Oscillator clock.
> -	- pclkN, clkN: Pairs of parent of input clock and input clock to the
> -		devices in this power domain. Maximum of 4 pairs (N = 0 to 3)
> -		are supported currently.
> +	- pclkN, clkN: Input clocks (clkN) to the devices in this power domain.
> +		Optionally with parrents (pclkN). If such parent is provided
> +		it will be used for reparenting the given clock when domain
> +		is turned on. Otherwise the parent before power down will be
> +		used. Maximum of 4 pairs (N = 0 to 3) are supported currently.
>  	- asbN: Clocks required by asynchronous bridges (ASB) present in
>  		the power domain. These clock should be enabled during power
>  		domain on/off operations.
> diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c
> index cbe56b35aea0..c55bcf52a6ad 100644
> --- a/arch/arm/mach-exynos/pm_domains.c
> +++ b/arch/arm/mach-exynos/pm_domains.c
> @@ -37,6 +37,7 @@ struct exynos_pm_domain {
>  	struct clk *oscclk;
>  	struct clk *clk[MAX_CLK_PER_DOMAIN];
>  	struct clk *pclk[MAX_CLK_PER_DOMAIN];
> +	unsigned int pclk_dynamic:MAX_CLK_PER_DOMAIN;
>  	struct clk *asb_clk[MAX_CLK_PER_DOMAIN];
>  };
>  
> @@ -62,6 +63,9 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
>  		for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) {
>  			if (IS_ERR(pd->clk[i]))
>  				break;
> +			/* If parent was not set in DT, save current parent */
> +			if (pd->pclk_dynamic & (1 << i))

Small nit: I personally think that using the BIT(i) macro for shifting bits
is more readable but I guess is a matter of personal taste.

> +				pd->pclk[i] = clk_get_parent(pd->clk[i]);
>  			if (clk_set_parent(pd->clk[i], pd->oscclk))
>  				pr_err("%s: error setting oscclk as parent to clock %d\n",
>  						pd->name, i);
> @@ -164,9 +168,8 @@ static __init int exynos4_pm_init_power_domain(void)
>  			snprintf(clk_name, sizeof(clk_name), "pclk%d", i);
>  			pd->pclk[i] = clk_get(dev, clk_name);
>  			if (IS_ERR(pd->pclk[i])) {
> -				clk_put(pd->clk[i]);
> -				pd->clk[i] = ERR_PTR(-EINVAL);
> -				break;
> +				pd->pclk_dynamic |= (1 << i);
> +				pd->pclk[i] = clk_get_parent(pd->clk[i]);
>  			}
>  		}
>  
> 

Patch looks good to me:

Reviewed-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>

I tested $subject along with 2/2 on an Exynos5420 Peach Pit and I see
that display comes up correctly on boot. Also after disabling the display:

$ echo 1 > /sys/devices/platform/exynos-drm/graphics/fb0/blank

the DISP1 power domain is off in /sys/kernel/debug/pm_genpd/pm_genpd_summary
and after enabling it again with:

$ echo 0 > /sys/devices/platform/exynos-drm/graphics/fb0/blank

the DISP1 power domain is on again and the display is working correctly.

Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>

Best regards,
Javier

WARNING: multiple messages have this Message-ID (diff)
From: javier.martinez@collabora.co.uk (Javier Martinez Canillas)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/2] ARM: EXYNOS: Get current parent clock for power domain on/off
Date: Thu, 02 Apr 2015 14:29:31 +0200	[thread overview]
Message-ID: <551D362B.90901@collabora.co.uk> (raw)
In-Reply-To: <1427961979-29477-1-git-send-email-k.kozlowski@samsung.com>

Hello Krzysztof,

On 04/02/2015 10:06 AM, Krzysztof Kozlowski wrote:
> Using a fixed (by DTS) parent for clocks when turning on the power domain
> may introduce issues in other drivers. For example when such driver
> changes the parent during runtime and expects that he is the only place
> of such change.
> 
> Do not rely entirely on DTS providing the fixed parent for such clocks.
> Instead if "pclkN" clock name is missing, grab a current parent of clock
> with clk_get_parent().
> 
> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> ---
>  Documentation/devicetree/bindings/arm/exynos/power_domain.txt | 8 +++++---
>  arch/arm/mach-exynos/pm_domains.c                             | 9 ++++++---
>  2 files changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> index 5da38c5ed476..0fc1312f6fd5 100644
> --- a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> +++ b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
> @@ -19,9 +19,11 @@ Optional Properties:
>  	domains.
>  - clock-names: The following clocks can be specified:
>  	- oscclk: Oscillator clock.
> -	- pclkN, clkN: Pairs of parent of input clock and input clock to the
> -		devices in this power domain. Maximum of 4 pairs (N = 0 to 3)
> -		are supported currently.
> +	- pclkN, clkN: Input clocks (clkN) to the devices in this power domain.
> +		Optionally with parrents (pclkN). If such parent is provided
> +		it will be used for reparenting the given clock when domain
> +		is turned on. Otherwise the parent before power down will be
> +		used. Maximum of 4 pairs (N = 0 to 3) are supported currently.
>  	- asbN: Clocks required by asynchronous bridges (ASB) present in
>  		the power domain. These clock should be enabled during power
>  		domain on/off operations.
> diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c
> index cbe56b35aea0..c55bcf52a6ad 100644
> --- a/arch/arm/mach-exynos/pm_domains.c
> +++ b/arch/arm/mach-exynos/pm_domains.c
> @@ -37,6 +37,7 @@ struct exynos_pm_domain {
>  	struct clk *oscclk;
>  	struct clk *clk[MAX_CLK_PER_DOMAIN];
>  	struct clk *pclk[MAX_CLK_PER_DOMAIN];
> +	unsigned int pclk_dynamic:MAX_CLK_PER_DOMAIN;
>  	struct clk *asb_clk[MAX_CLK_PER_DOMAIN];
>  };
>  
> @@ -62,6 +63,9 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
>  		for (i = 0; i < MAX_CLK_PER_DOMAIN; i++) {
>  			if (IS_ERR(pd->clk[i]))
>  				break;
> +			/* If parent was not set in DT, save current parent */
> +			if (pd->pclk_dynamic & (1 << i))

Small nit: I personally think that using the BIT(i) macro for shifting bits
is more readable but I guess is a matter of personal taste.

> +				pd->pclk[i] = clk_get_parent(pd->clk[i]);
>  			if (clk_set_parent(pd->clk[i], pd->oscclk))
>  				pr_err("%s: error setting oscclk as parent to clock %d\n",
>  						pd->name, i);
> @@ -164,9 +168,8 @@ static __init int exynos4_pm_init_power_domain(void)
>  			snprintf(clk_name, sizeof(clk_name), "pclk%d", i);
>  			pd->pclk[i] = clk_get(dev, clk_name);
>  			if (IS_ERR(pd->pclk[i])) {
> -				clk_put(pd->clk[i]);
> -				pd->clk[i] = ERR_PTR(-EINVAL);
> -				break;
> +				pd->pclk_dynamic |= (1 << i);
> +				pd->pclk[i] = clk_get_parent(pd->clk[i]);
>  			}
>  		}
>  
> 

Patch looks good to me:

Reviewed-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>

I tested $subject along with 2/2 on an Exynos5420 Peach Pit and I see
that display comes up correctly on boot. Also after disabling the display:

$ echo 1 > /sys/devices/platform/exynos-drm/graphics/fb0/blank

the DISP1 power domain is off in /sys/kernel/debug/pm_genpd/pm_genpd_summary
and after enabling it again with:

$ echo 0 > /sys/devices/platform/exynos-drm/graphics/fb0/blank

the DISP1 power domain is on again and the display is working correctly.

Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>

Best regards,
Javier

  parent reply	other threads:[~2015-04-02 12:29 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-02  8:06 [PATCH 1/2] ARM: EXYNOS: Get current parent clock for power domain on/off Krzysztof Kozlowski
2015-04-02  8:06 ` Krzysztof Kozlowski
2015-04-02  8:06 ` Krzysztof Kozlowski
2015-04-02  8:06 ` [PATCH 2/2] ARM: dts: Use last parent for clocks during " Krzysztof Kozlowski
2015-04-02  8:06   ` Krzysztof Kozlowski
2015-04-02 12:30   ` Javier Martinez Canillas
2015-04-02 12:30     ` Javier Martinez Canillas
2015-04-02 12:29 ` Javier Martinez Canillas [this message]
2015-04-02 12:29   ` [PATCH 1/2] ARM: EXYNOS: Get current parent clock for " Javier Martinez Canillas
2015-04-02 12:44   ` Krzysztof Kozlowski
2015-04-02 12:44     ` Krzysztof Kozlowski
2015-04-03  8:12     ` Andrzej Hajda
2015-04-03  8:12       ` Andrzej Hajda
     [not found]       ` <551E4B85.1000903-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2015-04-03  8:35         ` Krzysztof Kozlowski
2015-04-03  8:35           ` Krzysztof Kozlowski
2015-04-03  8:35           ` Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=551D362B.90901@collabora.co.uk \
    --to=javier.martinez@collabora.co.uk \
    --cc=devicetree@vger.kernel.org \
    --cc=k.kozlowski@samsung.com \
    --cc=kgene@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.