From: Tomasz Figa <t.figa@samsung.com>
To: Prasanna Kumar <prasanna.ps@samsung.com>,
Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: linux-samsung-soc@vger.kernel.org, kgene.kim@samsung.com,
linux-arm-kernel@lists.infradead.org,
Mike Turquette <mturquette@linaro.org>
Subject: Re: [PATCH] arm:exynos5250: Restore CLK_SRC_TOP3 register via CCF
Date: Tue, 26 Mar 2013 12:28:13 +0100 [thread overview]
Message-ID: <2280810.4mfMsDOM0e@amdc1227> (raw)
In-Reply-To: <1364272935-30607-1-git-send-email-prasanna.ps@samsung.com>
Hi Prasanna,
On Tuesday 26 of March 2013 10:12:15 Prasanna Kumar wrote:
> From: Prasanna Kumar <prasanna.ps@samsung.com>
>
> This patch adds support for restoring CLK_SRC_TOP3 register
> which gets modified while powergating corresponding power domains
> after a cycle of Suspend-to-Resume.
>
> Please refer below URL to know the background of this issue.
> http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg14347.html.
>
> This is based on Common Clock Framework defined for exynos5250 and
> patch mentioned here
> http://www.mail-archive.com/linux-samsung-soc@vger.kernel.org/msg16739.html
>
> Signed-off-by: Prasanna Kumar <prasanna.ps@samsung.com>
> ---
> arch/arm/mach-exynos/pm_domains.c | 43
> +++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0
> deletions(-)
>
> diff --git a/arch/arm/mach-exynos/pm_domains.c
> b/arch/arm/mach-exynos/pm_domains.c index 9f1351d..b5ed384 100644
> --- a/arch/arm/mach-exynos/pm_domains.c
> +++ b/arch/arm/mach-exynos/pm_domains.c
First of all, why this is happening in power domain driver? It does not (and
should not) know anything about clocks. I'm sure you can find a better place
for this.
> @@ -21,8 +21,11 @@
> #include <linux/of_address.h>
> #include <linux/of_platform.h>
> #include <linux/sched.h>
> +#include <linux/clk.h>
> +#include <linux/clk-private.h>
This header is _not_ supposed included outside clock core and clock drivers.
>
> #include <mach/regs-pmu.h>
> +#include <plat/cpu.h>
> #include <plat/devs.h>
>
> /*
> @@ -35,6 +38,43 @@ struct exynos_pm_domain {
> struct generic_pm_domain pd;
> };
> +static int exynos_pdclk_restore(struct exynos_pm_domain *domain)
> +{
> + int i = 0;
> + struct clk *p_clk;
> + struct clk_hw *hw_clk;
> + const struct clk_ops *p_ops;
> +
> + const char *pdclks[][2] = {
> + { "gsc-power-domain",
> + "m_sub_aclk266" },
> + { "gsc-power-domain",
> + "m_sub_aclk300" },
> + { "mfc-power-domain",
> + "m_sub_aclk333" },
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(pdclks); i++) {
> + if (!strcmp(domain->name, pdclks[i][0])) {
> + p_clk = clk_get(NULL, pdclks[i][1]);
> + if (IS_ERR(p_clk)) {
> + pr_err("failed to get base clk\n");
> + return PTR_ERR(p_clk);
> + }
> +
> + hw_clk = __clk_get_hw(p_clk);
> + if (IS_ERR(hw_clk)) {
> + pr_err("failed to get hw_clk\n");
> + return PTR_ERR(hw_clk);
> + }
This is completely wrong: hw_clk is an internal structure that should be used
only inside the driver of this particular clock and clock core, nowhere else.
> + p_ops = p_clk->ops;
> + if (p_ops != NULL && p_ops->set_parent != NULL)
> + p_clk->ops->set_parent(hw_clk, 1);
Same goes here: p_clk is an opaque pointer to something that can _not_ be
dereferenced outside clock core.
> + }
> + }
> + return 0;
> +}
> +
NAK.
This code contains so many Linux kernel development antipatterns, that it's
missing only IS_ERR_OR_NULL to be placed on top of hall of fame of such, if
one exists.
> static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
> {
> struct exynos_pm_domain *pd;
> @@ -61,6 +101,9 @@ static int exynos_pd_power(struct generic_pm_domain
> *domain, bool power_on) cpu_relax();
> usleep_range(80, 100);
> }
> +
> + if (!power_on && soc_is_exynos5250())
> + exynos_pdclk_restore(pd);
> return 0;
> }
Best regards,
--
Tomasz Figa
Samsung Poland R&D Center
SW Solution Development, Kernel and System Framework
WARNING: multiple messages have this Message-ID (diff)
From: t.figa@samsung.com (Tomasz Figa)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] arm:exynos5250: Restore CLK_SRC_TOP3 register via CCF
Date: Tue, 26 Mar 2013 12:28:13 +0100 [thread overview]
Message-ID: <2280810.4mfMsDOM0e@amdc1227> (raw)
In-Reply-To: <1364272935-30607-1-git-send-email-prasanna.ps@samsung.com>
Hi Prasanna,
On Tuesday 26 of March 2013 10:12:15 Prasanna Kumar wrote:
> From: Prasanna Kumar <prasanna.ps@samsung.com>
>
> This patch adds support for restoring CLK_SRC_TOP3 register
> which gets modified while powergating corresponding power domains
> after a cycle of Suspend-to-Resume.
>
> Please refer below URL to know the background of this issue.
> http://www.mail-archive.com/linux-samsung-soc at vger.kernel.org/msg14347.html.
>
> This is based on Common Clock Framework defined for exynos5250 and
> patch mentioned here
> http://www.mail-archive.com/linux-samsung-soc at vger.kernel.org/msg16739.html
>
> Signed-off-by: Prasanna Kumar <prasanna.ps@samsung.com>
> ---
> arch/arm/mach-exynos/pm_domains.c | 43
> +++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0
> deletions(-)
>
> diff --git a/arch/arm/mach-exynos/pm_domains.c
> b/arch/arm/mach-exynos/pm_domains.c index 9f1351d..b5ed384 100644
> --- a/arch/arm/mach-exynos/pm_domains.c
> +++ b/arch/arm/mach-exynos/pm_domains.c
First of all, why this is happening in power domain driver? It does not (and
should not) know anything about clocks. I'm sure you can find a better place
for this.
> @@ -21,8 +21,11 @@
> #include <linux/of_address.h>
> #include <linux/of_platform.h>
> #include <linux/sched.h>
> +#include <linux/clk.h>
> +#include <linux/clk-private.h>
This header is _not_ supposed included outside clock core and clock drivers.
>
> #include <mach/regs-pmu.h>
> +#include <plat/cpu.h>
> #include <plat/devs.h>
>
> /*
> @@ -35,6 +38,43 @@ struct exynos_pm_domain {
> struct generic_pm_domain pd;
> };
> +static int exynos_pdclk_restore(struct exynos_pm_domain *domain)
> +{
> + int i = 0;
> + struct clk *p_clk;
> + struct clk_hw *hw_clk;
> + const struct clk_ops *p_ops;
> +
> + const char *pdclks[][2] = {
> + { "gsc-power-domain",
> + "m_sub_aclk266" },
> + { "gsc-power-domain",
> + "m_sub_aclk300" },
> + { "mfc-power-domain",
> + "m_sub_aclk333" },
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(pdclks); i++) {
> + if (!strcmp(domain->name, pdclks[i][0])) {
> + p_clk = clk_get(NULL, pdclks[i][1]);
> + if (IS_ERR(p_clk)) {
> + pr_err("failed to get base clk\n");
> + return PTR_ERR(p_clk);
> + }
> +
> + hw_clk = __clk_get_hw(p_clk);
> + if (IS_ERR(hw_clk)) {
> + pr_err("failed to get hw_clk\n");
> + return PTR_ERR(hw_clk);
> + }
This is completely wrong: hw_clk is an internal structure that should be used
only inside the driver of this particular clock and clock core, nowhere else.
> + p_ops = p_clk->ops;
> + if (p_ops != NULL && p_ops->set_parent != NULL)
> + p_clk->ops->set_parent(hw_clk, 1);
Same goes here: p_clk is an opaque pointer to something that can _not_ be
dereferenced outside clock core.
> + }
> + }
> + return 0;
> +}
> +
NAK.
This code contains so many Linux kernel development antipatterns, that it's
missing only IS_ERR_OR_NULL to be placed on top of hall of fame of such, if
one exists.
> static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
> {
> struct exynos_pm_domain *pd;
> @@ -61,6 +101,9 @@ static int exynos_pd_power(struct generic_pm_domain
> *domain, bool power_on) cpu_relax();
> usleep_range(80, 100);
> }
> +
> + if (!power_on && soc_is_exynos5250())
> + exynos_pdclk_restore(pd);
> return 0;
> }
Best regards,
--
Tomasz Figa
Samsung Poland R&D Center
SW Solution Development, Kernel and System Framework
next prev parent reply other threads:[~2013-03-26 11:28 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-26 4:42 [PATCH] arm:exynos5250: Restore CLK_SRC_TOP3 register via CCF Prasanna Kumar
2013-03-26 4:42 ` Prasanna Kumar
2013-03-26 11:28 ` Tomasz Figa [this message]
2013-03-26 11:28 ` Tomasz Figa
2013-03-27 1:45 ` Mike Turquette
2013-03-27 1:45 ` Mike Turquette
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=2280810.4mfMsDOM0e@amdc1227 \
--to=t.figa@samsung.com \
--cc=kgene.kim@samsung.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mturquette@linaro.org \
--cc=prasanna.ps@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.