From: "Cousson, Benoit" <b-cousson@ti.com>
To: "Hunter, Jon" <jon-hunter@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>, linux-omap <linux-omap@vger.kernel.org>
Subject: Re: [PATCH 1/6] OMAP4: Add missing clock divider for OCP_ABE_ICLK
Date: Wed, 27 Jul 2011 00:45:43 +0200 [thread overview]
Message-ID: <4E2F4397.8060004@ti.com> (raw)
In-Reply-To: <4E204FFC.5080700@ti.com>
Hi Jon,
On 7/15/2011 4:34 PM, Hunter, Jon wrote:
> Hi Paul,
>
> On 7/15/2011 3:21, Paul Walmsley wrote:
>> cc'ing Benoît
>>
>> Hi Jon
>>
>> On Thu, 14 Jul 2011, Jon Hunter wrote:
>>
>>> From: Jon Hunter<jon-hunter@ti.com>
>>>
>>> The parent clock of the OCP_ABE_ICLK is the AESS_FCLK and the
>>> parent clock of the AESS_FCLK is the ABE_FCLK...
>>>
>>> ABE_FCLK --> AESS_FCLK --> OCP_ABE_ICLK
>>>
>>> The AESS_FCLK and OCP_ABE_ICLK clocks both have dividers which
>>> determine their operational frequency. However, the dividers for
>>> the AESS_FCLK and OCP_ABE_ICLK are controlled via a single bit,
>>> which is the CM1_ABE_AESS_CLKCTRL[24] bit.> When this bit is set to
>>> 0, the AESS_FCLK divider is 1 and the OCP_ABE_ICLK divider is 2.
>>> Similarly, when this bit is set to 1, the AESS_FCLK divider is 2
>>> and the OCP_ABE_ICLK is 1.
>>
>> Sigh. This type of hardware design makes software design difficult :-(
>
> Hopefully, because this is a interface clock the impact is really
> minimal...more below...
>
>>> The above relationship between the AESS_FCLK and OCP_ABE_ICLK
>>> dividers ensure that the OCP_ABE_ICLK clock is always half the
>>> frequency of the ABE_CLK...
>>>
>>> OCP_ABE_ICLK = ABE_FCLK/2
>>>
>>> The divider for the OCP_ABE_ICLK is currently missing so add a
>>> divider that will ensure the OCP_ABE_ICLK frequency is always half
>>> the ABE_FCLK frequency.
>>>
>>> Signed-off-by: Jon Hunter<jon-hunter@ti.com>
>>> ---
>>> arch/arm/mach-omap2/clock44xx_data.c | 16 +++++++++++++++-
>>> 1 files changed, 15 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
>>> index 8c96567..6e158ce 100644
>>> --- a/arch/arm/mach-omap2/clock44xx_data.c
>>> +++ b/arch/arm/mach-omap2/clock44xx_data.c
>>> @@ -1301,11 +1301,25 @@ static struct clk mcasp3_fclk = {
>>> .recalc =&followparent_recalc,
>>> };
>>>
>>> +static const struct clksel_rate div2_2to1_rates[] = {
>>> + { .div = 1, .val = 1, .flags = RATE_IN_4430 },
>>> + { .div = 2, .val = 0, .flags = RATE_IN_4430 },
>>> + { .div = 0 },
>>> +};
>>> +
>>> +static const struct clksel ocp_abe_iclk_div[] = {
>>> + { .parent =&aess_fclk, .rates = div2_2to1_rates },
>>> + { .parent = NULL },
>>> +};
>>> +
>>> static struct clk ocp_abe_iclk = {
>>> .name = "ocp_abe_iclk",
>>> .parent =&aess_fclk,
>>> + .clksel = ocp_abe_iclk_div,
>>> + .clksel_reg = OMAP4430_CM1_ABE_AESS_CLKCTRL,
>>> + .clksel_mask = OMAP4430_CLKSEL_AESS_FCLK_MASK,
>>> .ops =&clkops_null,
>>> - .recalc =&followparent_recalc,
>>> + .recalc =&omap2_clksel_recalc,
>>> };
>>>
>>> static struct clk per_abe_24m_fclk = {
>>
>> I guess the reason that this patch can get away with this is because it
>> doesn't allow software to change the rate of ocp_abe_iclk, and the
>> ocp_abe_iclk is a child of aess_fclk, so when aess_fclk is changed, it
>> will recalc ocp_abe_iclk.
>>
>> Benoît, what do you think? Is this a reasonable approach for the script?
>> Or do we need to deal with some kind of 'linked clock' implementation...
>
> If you want my two cents on this matter, I would say that...
>
> 1). People should not need to configure the "ocp_abe_iclk" clock
> directly, because regardless of the divider setting it is always 1/2 the
> "abe_fclk". In other words, only the "aess_fclk" frequency is really
> changing because of the divider and the above relationship ensures that
> the "ocp_abe_iclk" is always the same frequency. So a user only cares
> about the "aess_fclk" frequency and the "ocp_abe_iclk" frequency is
> handled for them.
>
> 2). The "ocp_abe_iclk" is an interface clock and is not a parent to any
> other functional clock and therefore, is not driving any internal logic
> in a peripheral which would have a direct impact of the speed of that
> peripheral.
Since both dividers are linked, I exposed only one to SW on purpose to
avoid conflict and confusion.
As you said, we should and can only take care of the intermediate clock
node.
The only drawback of not linking both nodes is that the clock rate of
the ocp_abe_iclk will be wrong if the parent clksel is changed.
So if the recalc is working well your patch should fix that.
My only concern is to find a way to generate that kind of hacky clock
node:-(
> However, there does appear to be another bug here in the
> clock44xx_data.c as it shows that the "ocp_abe_iclk" is parent to the
> "slimbus1_fck" which I believe is incorrect. According to the TRM, the
> the ocp_abe_iclk is parent to the slimbus1_iclk. I can send another
> patch for this. However, I will let Benoit chime in first.
This is again a consequence of the fake modulemode clock we introduced
initially and I tried to fix in the recent hwmod series.
Since the slimbus1 module does not have any main_clk, but instead a
bunch of optional clocks, I cannot affect any of them as the parent of
the modulemode.
That's why the iclk clock was used as the parent. That kind of issue
will not be there anymore after the module mode series.
Since the modulemode is not really a clock, the _ick / _fck extension
was not necessarily accurate previously.
Regards,
Benoit
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2011-07-26 22:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-14 23:24 [PATCH 1/6] OMAP4: Add missing clock divider for OCP_ABE_ICLK Jon Hunter
2011-07-15 8:21 ` Paul Walmsley
2011-07-15 14:34 ` Jon Hunter
2011-07-18 20:57 ` Jon Hunter
2011-07-18 21:46 ` Jon Hunter
2011-07-26 22:45 ` Cousson, Benoit [this message]
2011-08-29 4:09 ` Paul Walmsley
2011-09-14 19:32 ` Jon Hunter
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=4E2F4397.8060004@ti.com \
--to=b-cousson@ti.com \
--cc=jon-hunter@ti.com \
--cc=linux-omap@vger.kernel.org \
--cc=paul@pwsan.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox