From: shawn.guo@freescale.com (Shawn Guo)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/5] ARM: imx: clk-gate2: Use post decrement for share_count
Date: Wed, 2 Jul 2014 12:35:09 +0800 [thread overview]
Message-ID: <20140702043508.GA16176@dragon> (raw)
In-Reply-To: <CAOMZO5BmJFmjYP9=rfR5eRKWPioPoW=UjE_h=Q3kbEAJGRixAQ@mail.gmail.com>
On Tue, Jul 01, 2014 at 02:44:40PM -0300, Fabio Estevam wrote:
> On Tue, Jul 1, 2014 at 8:52 AM, Shawn Guo <shawn.guo@freescale.com> wrote:
>
> >> --- a/arch/arm/mach-imx/clk-gate2.c
> >> +++ b/arch/arm/mach-imx/clk-gate2.c
> >> @@ -67,7 +67,7 @@ static void clk_gate2_disable(struct clk_hw *hw)
> >>
> >> spin_lock_irqsave(gate->lock, flags);
> >>
> >> - if (gate->share_count && --(*gate->share_count) > 0)
> >> + if (gate->share_count && (*gate->share_count)-- > 0)
> >
> > The change makes no sense. Let's say that clk_gate2_disable() gets
> > called with share_count being 1. In this case, we should access
> > register to gate the clock, right?
>
> If share_count is 1 it means that someone else is using the clock and
> we can't disable it.
You do not really know it's someone else or itself.
>
> Please try running the series without this patch. When the extern
> audio clock is enabled, share_count is 1. Later the the spdif clock
> (the one that is shared with extern audio clock) is disabled by the
> CCF as it is not used, which makes the extern audio clock to be also
> disabled, which is not what we want.
>
> What would you suggest?
What about the patch below?
Shawn
----8<-------------
>From 0ed4b3edc661c63f86c914ea3c6deb3af3438151 Mon Sep 17 00:00:00 2001
From: Shawn Guo <shawn.guo@freescale.com>
Date: Wed, 2 Jul 2014 11:32:06 +0800
Subject: [PATCH] ARM: imx: fix shared gate clock to have its own enable count
Let's say clock A and B are two gate clocks that share the same register
bit in hardware. Therefore they should be registered as shared gate
clocks with imx_clk_gate2_shared().
In the current implementation, clk_enable(A) call will have share_count
become 1. If clk_disable(B) is called right after that, the register
bit will be cleared to gate off the clocks. This is unexpected. The
cause for that is there is no enable count tracking for clock A and B
respectively.
The patch fixes the issue by adding enable_count into clk_gate2, and
tracks it prior to share_count in .enable and .disable. Also,
.is_enabled is fixed to report enable state instead of hardware state
in case of shared gate clock.
Reported-by: Fabio Estevam <fabio.estevam@freescale.com>
Cc: <stable@vger.kernel.org>
Fixes: f9f28cdf2167 ("ARM: imx: add shared gate clock support")
Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
---
arch/arm/mach-imx/clk-gate2.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c
index 4ba587da89d2..c5dca7cdbbb1 100644
--- a/arch/arm/mach-imx/clk-gate2.c
+++ b/arch/arm/mach-imx/clk-gate2.c
@@ -33,6 +33,7 @@ struct clk_gate2 {
u8 bit_idx;
u8 flags;
spinlock_t *lock;
+ unsigned int enable_count;
unsigned int *share_count;
};
@@ -46,6 +47,9 @@ static int clk_gate2_enable(struct clk_hw *hw)
spin_lock_irqsave(gate->lock, flags);
+ if (gate->enable_count++ > 0)
+ goto out;
+
if (gate->share_count && (*gate->share_count)++ > 0)
goto out;
@@ -67,6 +71,9 @@ static void clk_gate2_disable(struct clk_hw *hw)
spin_lock_irqsave(gate->lock, flags);
+ if (--gate->enable_count > 0)
+ goto out;
+
if (gate->share_count && --(*gate->share_count) > 0)
goto out;
@@ -83,6 +90,13 @@ static int clk_gate2_is_enabled(struct clk_hw *hw)
u32 reg;
struct clk_gate2 *gate = to_clk_gate2(hw);
+ /*
+ * In case this is a shared gate, we cannot just report the hardware
+ * state but its own enable state.
+ */
+ if (gate->share_count)
+ return !!gate->enable_count;
+
reg = readl(gate->reg);
if (((reg >> gate->bit_idx) & 1) == 1)
--
1.8.3.2
next prev parent reply other threads:[~2014-07-02 4:35 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-01 5:55 [PATCH 1/5] ARM: dts: imx6sx: Fix sdma node Fabio Estevam
2014-07-01 5:55 ` [PATCH 2/5] ARM: dts: imx6sx: Fix SSI nodes Fabio Estevam
2014-07-01 7:45 ` Markus Pargmann
2014-07-01 7:49 ` Markus Pargmann
2014-07-01 5:55 ` [PATCH 3/5] ARM: imx: clk-imx6sx: Remove SSI IPG clocks Fabio Estevam
2014-07-01 6:23 ` Nicolin Chen
2014-07-01 5:55 ` [PATCH 4/5] ARM: imx: clk-gate2: Use post decrement for share_count Fabio Estevam
2014-07-01 11:52 ` Shawn Guo
2014-07-01 17:44 ` Fabio Estevam
2014-07-02 4:35 ` Shawn Guo [this message]
2014-07-02 14:27 ` Fabio Estevam
2014-07-03 3:26 ` Shawn Guo
2014-07-02 15:29 ` Mike Turquette
2014-07-02 16:52 ` Fabio Estevam
2014-07-02 17:17 ` Mike Turquette
2014-07-03 7:46 ` Shawn Guo
2014-07-03 7:56 ` Shawn Guo
2014-07-01 5:55 ` [PATCH 5/5] ARM: dts: imx6sx-sdb: Add audio support Fabio Estevam
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=20140702043508.GA16176@dragon \
--to=shawn.guo@freescale.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).