From: tim.gardner@canonical.com (Tim Gardner)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/1] arm: mxc: utilise usecount field in clock operations
Date: Thu, 22 Apr 2010 17:00:00 -0600 [thread overview]
Message-ID: <4BD0D4F0.9090605@canonical.com> (raw)
In-Reply-To: <d501dcf8dbe98ed7f5aa9e7b34e68f0e1076ac84.1271968118.git.amit.kucheria@verdurent.com>
On 04/22/2010 02:30 PM, Amit Kucheria wrote:
> From: Amit Kucheria<amit.kucheria@canonical.com>
>
> This patch fixes the clock refcounting when reparenting is used.
>
> Sascha just pointed out a good explanation of refcounting here:
> http://www.spinics.net/lists/arm-kernel/msg85879.html
>
> Signed-off-by: Amit Kucheria<amit.kucheria@canonical.com>
> ---
> arch/arm/plat-mxc/clock.c | 34 ++++++++++++++++++++++------------
> 1 files changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
> index 323ff8c..14781cc 100644
> --- a/arch/arm/plat-mxc/clock.c
> +++ b/arch/arm/plat-mxc/clock.c
> @@ -50,15 +50,16 @@ static DEFINE_MUTEX(clocks_mutex);
>
> static void __clk_disable(struct clk *clk)
> {
> - if (clk == NULL || IS_ERR(clk))
> + WARN_ON(!clk->usecount);
> + if (clk == NULL || IS_ERR(clk) || !clk->usecount)
> return;
>
The clk==NULL check seem superfluous if WARN_ON(!clk->usecount) has
already dereferenced clk (and possibly crashed). You might need two
statements if its likely that clk could be NULL.
> - __clk_disable(clk->parent);
> - __clk_disable(clk->secondary);
> -
> - WARN_ON(!clk->usecount);
> - if (!(--clk->usecount)&& clk->disable)
> - clk->disable(clk);
> + if (!(--clk->usecount)) {
> + if (clk->disable)
> + clk->disable(clk);
> + __clk_disable(clk->parent);
> + __clk_disable(clk->secondary);
> + }
> }
>
> static int __clk_enable(struct clk *clk)
> @@ -66,12 +67,13 @@ static int __clk_enable(struct clk *clk)
> if (clk == NULL || IS_ERR(clk))
> return -EINVAL;
>
> - __clk_enable(clk->parent);
> - __clk_enable(clk->secondary);
> -
> - if (clk->usecount++ == 0&& clk->enable)
> - clk->enable(clk);
> + if (clk->usecount++ == 0) {
> + __clk_enable(clk->parent);
> + __clk_enable(clk->secondary);
>
> + if (clk->enable)
> + clk->enable(clk);
> + }
> return 0;
> }
>
> @@ -160,17 +162,25 @@ EXPORT_SYMBOL(clk_set_rate);
> int clk_set_parent(struct clk *clk, struct clk *parent)
> {
> int ret = -EINVAL;
> + struct clk *prev_parent = clk->parent;
>
> if (clk == NULL || IS_ERR(clk) || parent == NULL ||
> IS_ERR(parent) || clk->set_parent == NULL)
> return ret;
>
> + if (clk->usecount != 0)
> + clk_enable(parent);
> +
> mutex_lock(&clocks_mutex);
> ret = clk->set_parent(clk, parent);
> if (ret == 0)
> clk->parent = parent;
> +
> mutex_unlock(&clocks_mutex);
>
> + if (clk->usecount != 0)
> + clk_disable(prev_parent);
> +
> return ret;
> }
> EXPORT_SYMBOL(clk_set_parent);
--
Tim Gardner tim.gardner at canonical.com
WARNING: multiple messages have this Message-ID (diff)
From: Tim Gardner <tim.gardner@canonical.com>
To: Amit Kucheria <amit.kucheria@verdurent.com>
Cc: "Sascha Hauer" <s.hauer@pengutronix.de>,
"Amit Kucheria" <amit.kucheria@canonical.com>,
"Russell King" <linux@arm.linux.org.uk>,
"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/1] arm: mxc: utilise usecount field in clock operations
Date: Thu, 22 Apr 2010 17:00:00 -0600 [thread overview]
Message-ID: <4BD0D4F0.9090605@canonical.com> (raw)
In-Reply-To: <d501dcf8dbe98ed7f5aa9e7b34e68f0e1076ac84.1271968118.git.amit.kucheria@verdurent.com>
On 04/22/2010 02:30 PM, Amit Kucheria wrote:
> From: Amit Kucheria<amit.kucheria@canonical.com>
>
> This patch fixes the clock refcounting when reparenting is used.
>
> Sascha just pointed out a good explanation of refcounting here:
> http://www.spinics.net/lists/arm-kernel/msg85879.html
>
> Signed-off-by: Amit Kucheria<amit.kucheria@canonical.com>
> ---
> arch/arm/plat-mxc/clock.c | 34 ++++++++++++++++++++++------------
> 1 files changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
> index 323ff8c..14781cc 100644
> --- a/arch/arm/plat-mxc/clock.c
> +++ b/arch/arm/plat-mxc/clock.c
> @@ -50,15 +50,16 @@ static DEFINE_MUTEX(clocks_mutex);
>
> static void __clk_disable(struct clk *clk)
> {
> - if (clk == NULL || IS_ERR(clk))
> + WARN_ON(!clk->usecount);
> + if (clk == NULL || IS_ERR(clk) || !clk->usecount)
> return;
>
The clk==NULL check seem superfluous if WARN_ON(!clk->usecount) has
already dereferenced clk (and possibly crashed). You might need two
statements if its likely that clk could be NULL.
> - __clk_disable(clk->parent);
> - __clk_disable(clk->secondary);
> -
> - WARN_ON(!clk->usecount);
> - if (!(--clk->usecount)&& clk->disable)
> - clk->disable(clk);
> + if (!(--clk->usecount)) {
> + if (clk->disable)
> + clk->disable(clk);
> + __clk_disable(clk->parent);
> + __clk_disable(clk->secondary);
> + }
> }
>
> static int __clk_enable(struct clk *clk)
> @@ -66,12 +67,13 @@ static int __clk_enable(struct clk *clk)
> if (clk == NULL || IS_ERR(clk))
> return -EINVAL;
>
> - __clk_enable(clk->parent);
> - __clk_enable(clk->secondary);
> -
> - if (clk->usecount++ == 0&& clk->enable)
> - clk->enable(clk);
> + if (clk->usecount++ == 0) {
> + __clk_enable(clk->parent);
> + __clk_enable(clk->secondary);
>
> + if (clk->enable)
> + clk->enable(clk);
> + }
> return 0;
> }
>
> @@ -160,17 +162,25 @@ EXPORT_SYMBOL(clk_set_rate);
> int clk_set_parent(struct clk *clk, struct clk *parent)
> {
> int ret = -EINVAL;
> + struct clk *prev_parent = clk->parent;
>
> if (clk == NULL || IS_ERR(clk) || parent == NULL ||
> IS_ERR(parent) || clk->set_parent == NULL)
> return ret;
>
> + if (clk->usecount != 0)
> + clk_enable(parent);
> +
> mutex_lock(&clocks_mutex);
> ret = clk->set_parent(clk, parent);
> if (ret == 0)
> clk->parent = parent;
> +
> mutex_unlock(&clocks_mutex);
>
> + if (clk->usecount != 0)
> + clk_disable(prev_parent);
> +
> return ret;
> }
> EXPORT_SYMBOL(clk_set_parent);
--
Tim Gardner tim.gardner@canonical.com
next prev parent reply other threads:[~2010-04-22 23:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-22 20:30 [PATCH 1/1] arm: mxc: utilise usecount field in clock operations Amit Kucheria
2010-04-22 20:30 ` Amit Kucheria
2010-04-22 23:00 ` Tim Gardner [this message]
2010-04-22 23:00 ` Tim Gardner
2010-05-28 8:29 ` Amit Kucheria
2010-05-28 8:29 ` Amit Kucheria
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=4BD0D4F0.9090605@canonical.com \
--to=tim.gardner@canonical.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.