linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* OMAP4 DSS clock setup
@ 2011-03-30  6:48 Tomi Valkeinen
  2011-03-30  9:32 ` Cousson, Benoit
  0 siblings, 1 reply; 29+ messages in thread
From: Tomi Valkeinen @ 2011-03-30  6:48 UTC (permalink / raw)
  To: Cousson, Benoit, Paul Walmsley; +Cc: Semwal, Sumit, Taneja, Archit, linux-omap

Hi Benoit, Paul,

I've been discussing with Sumit and Archit to understand how the DSS
clocks are set up on OMAP4. I think I now have some idea how things
work, but I'm still at loss why things are the way they are.

So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
controllable, but it is affected by MODULEMODE bit.

Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
the TRM's DSS_FCLK.

Was that correct?

If so, from DSS driver's perspective, the dss_fck sounds very much like
an interface clock (it's always needed when DSS is used) and dss_dss_clk
sounds very much like functional clock (it's always needed, except if
DSI PLL is used for DSS functional clock).

If "dss_fck" would control DSS_FCLK and "dss_ick" would control
MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
and we wouldn't need any omap4 spesific trickery in the DSS driver.
("dss_dss_clk" wouldn't be needed).

Why are the clocks set up in this strange fashion?

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30  6:48 OMAP4 DSS clock setup Tomi Valkeinen
@ 2011-03-30  9:32 ` Cousson, Benoit
  2011-03-30 11:03   ` Tomi Valkeinen
  0 siblings, 1 reply; 29+ messages in thread
From: Cousson, Benoit @ 2011-03-30  9:32 UTC (permalink / raw)
  To: Valkeinen, Tomi; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Tomi,

On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
> Hi Benoit, Paul,
>
> I've been discussing with Sumit and Archit to understand how the DSS
> clocks are set up on OMAP4. I think I now have some idea how things
> work, but I'm still at loss why things are the way they are.
>
> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
> controllable, but it is affected by MODULEMODE bit.
>
> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
> the TRM's DSS_FCLK.
>
> Was that correct?

Yes. For the moment, but this is not the final state.

> If so, from DSS driver's perspective, the dss_fck sounds very much like
> an interface clock (it's always needed when DSS is used) and dss_dss_clk
> sounds very much like functional clock (it's always needed, except if
> DSI PLL is used for DSS functional clock).
>
> If "dss_fck" would control DSS_FCLK and "dss_ick" would control
> MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
> and we wouldn't need any omap4 spesific trickery in the DSS driver.
> ("dss_dss_clk" wouldn't be needed).

You cannot play with iclk, because this clock is supposed to be handled 
automatically by the HW. This was the case on OMAP2 & 3 as well BTW.

> Why are the clocks set up in this strange fashion?

There are a lot of historical reasons and some changes from OMAP3 to 
OMAP4 that are not well handle by the current clock fmwk / hwmod fmwk.
We are still trying to mimic OMAP2&3 clock management for OMAP4, and in 
fact we should do the opposite.

The issue is due to the confusion with the MODULEMODE and the real input 
clock state.
The MODULEMODE is just enabling the module (using iclk, fclk, opt clock) 
or whatever clk is used as input clock.
In the case of the DSS, several optional clocks can be used as fclk. 
SYS_CLK, DSSCLK or the output of the DSI.
In theory the MODULEMODE should be directly handled by hwmod since it is 
similar to enable / disable the module. Using a clock to manage the 
MODULEMODE is a temporary hack we are still using for the moment but 
that should be removed at some point.

The clock fmwk should be used only to select / enable the proper 
optional clocks.

In theory the current OMAP2 and OMAP3 iclken/fclken at PRCM level should 
be handled as a OMAP4 MODULEMODE and not as 2 clock nodes like it is the 
case today. Then we will have a consistent module / clock management.

Hope this will help and clarify a little bit the current mess :-)

Bottom-line is that you cannot do much at your level, the whole clock + 
hwmod fmwk should be improved.

Benoit

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30  9:32 ` Cousson, Benoit
@ 2011-03-30 11:03   ` Tomi Valkeinen
  2011-03-30 12:12     ` Cousson, Benoit
  0 siblings, 1 reply; 29+ messages in thread
From: Tomi Valkeinen @ 2011-03-30 11:03 UTC (permalink / raw)
  To: Cousson, Benoit; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
> Hi Tomi,
> 
> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
> > Hi Benoit, Paul,
> >
> > I've been discussing with Sumit and Archit to understand how the DSS
> > clocks are set up on OMAP4. I think I now have some idea how things
> > work, but I'm still at loss why things are the way they are.
> >
> > So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
> > clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
> > and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
> > controllable, but it is affected by MODULEMODE bit.
> >
> > Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
> > and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
> > the TRM's DSS_FCLK.
> >
> > Was that correct?
> 
> Yes. For the moment, but this is not the final state.
> 
> > If so, from DSS driver's perspective, the dss_fck sounds very much like
> > an interface clock (it's always needed when DSS is used) and dss_dss_clk
> > sounds very much like functional clock (it's always needed, except if
> > DSI PLL is used for DSS functional clock).
> >
> > If "dss_fck" would control DSS_FCLK and "dss_ick" would control
> > MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
> > and we wouldn't need any omap4 spesific trickery in the DSS driver.
> > ("dss_dss_clk" wouldn't be needed).
> 
> You cannot play with iclk, because this clock is supposed to be handled 
> automatically by the HW. This was the case on OMAP2 & 3 as well BTW.

Right.

But now we have 1) dss_fck, which isn't the DSS_FCLK in TRM, and in fact
not fck at all, or even clock at all 2) dss_dss_clk, a new clock whose
name doesn't match to anything in TRM, and is in fact the DSS_FCLK.

So they both sound like they are confusingly named.

If we had dss_fck matching to DSS_FCLK and dss_ick for MODULEMODE, they
would, in my opinion, be much more understandable and in many ways
relate to the way things are in the HW. Additionally this would match
the way clocks are on OMAP2/3 and things would just work.

So while I understand that neither the current way and my suggestion
exactly match the HW, and also that things are not ready yet and the
clocks will change, I don't understand why such a strange method to name
the clocks was used, when there's a simpler and backward compatible way.

And if this current way to handle OMAP4 DSS clocks is for some reason
better and can't be changed, could the OMAP2/3 clocks also be changed to
keep things consistent between OMAPs? Because the inconsistency between
platforms is the biggest problem for me.

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 11:03   ` Tomi Valkeinen
@ 2011-03-30 12:12     ` Cousson, Benoit
  2011-03-30 12:58       ` Tomi Valkeinen
  0 siblings, 1 reply; 29+ messages in thread
From: Cousson, Benoit @ 2011-03-30 12:12 UTC (permalink / raw)
  To: Valkeinen, Tomi; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

On 3/30/2011 1:03 PM, Valkeinen, Tomi wrote:
> On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
>> Hi Tomi,
>>
>> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
>>> Hi Benoit, Paul,
>>>
>>> I've been discussing with Sumit and Archit to understand how the DSS
>>> clocks are set up on OMAP4. I think I now have some idea how things
>>> work, but I'm still at loss why things are the way they are.
>>>
>>> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
>>> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
>>> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
>>> controllable, but it is affected by MODULEMODE bit.
>>>
>>> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
>>> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
>>> the TRM's DSS_FCLK.
>>>
>>> Was that correct?
>>
>> Yes. For the moment, but this is not the final state.
>>
>>> If so, from DSS driver's perspective, the dss_fck sounds very much like
>>> an interface clock (it's always needed when DSS is used) and dss_dss_clk
>>> sounds very much like functional clock (it's always needed, except if
>>> DSI PLL is used for DSS functional clock).

dss_dss_fck is one of the possible functional clocks, hence the optional 
attribute. You can run the DSS only for sys_clk is you want.
That's why the hwmod fmwk cannot choose for you which one you will need 
depending of your panel. It is up to the driver to select the correct one.

>>> If "dss_fck" would control DSS_FCLK and "dss_ick" would control
>>> MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
>>> and we wouldn't need any omap4 spesific trickery in the DSS driver.
>>> ("dss_dss_clk" wouldn't be needed).
>>
>> You cannot play with iclk, because this clock is supposed to be handled
>> automatically by the HW. This was the case on OMAP2&  3 as well BTW.
>
> Right.
>
> But now we have 1) dss_fck, which isn't the DSS_FCLK in TRM, and in fact
> not fck at all, or even clock at all 2) dss_dss_clk, a new clock whose
> name doesn't match to anything in TRM, and is in fact the DSS_FCLK.
>
> So they both sound like they are confusingly named.

The naming convention is simple: opt clock are using the module name + 
the original clock name: "dss_XXX", whereas the modulemode is using the 
module name + fck, because it is for the moment similar to the fclk we 
have on simpler module. iclk_en is not exposed at all on OMAP4.

optional clocks:

static struct clk dss_sys_clk = {
	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
	.enable_bit	= OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT,

static struct clk dss_tv_clk = {
	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
	.enable_bit	= OMAP4430_OPTFCLKEN_TV_CLK_SHIFT,

static struct clk dss_dss_clk = {
	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
	.enable_bit	= OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,

static struct clk dss_48mhz_clk = {
	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
	.enable_bit	= OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,


MODULEMODE:

static struct clk dss_fck = {
	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
	.enable_bit	= OMAP4430_MODULEMODE_SWCTRL,

> If we had dss_fck matching to DSS_FCLK and dss_ick for MODULEMODE, they
> would, in my opinion, be much more understandable and in many ways
> relate to the way things are in the HW. Additionally this would match
> the way clocks are on OMAP2/3 and things would just work.

No, because you should not have to play with iclk at all.
BTW, for my point of view you have such issue because your are still not 
using the pm_runtime API.
As soon as you will switch to pm_runtime, iclk_en and fclk_en (OMAP2&3 
name) or MODULEMODE will be handle by the fmwk. The driver will just 
have to handle the optional clock.

> So while I understand that neither the current way and my suggestion
> exactly match the HW, and also that things are not ready yet and the
> clocks will change, I don't understand why such a strange method to name
> the clocks was used, when there's a simpler and backward compatible way.

The point is that this automated method works for every IPs in the OMAP 
except the DSS that is not managing its clocks like other modules.
Moreover, since the clock fmwk is creating aliases for these clock 
nodes, you should never see at all that dss_dss_clk node that seems to 
bother you.

> And if this current way to handle OMAP4 DSS clocks is for some reason
> better and can't be changed, could the OMAP2/3 clocks also be changed to
> keep things consistent between OMAPs? Because the inconsistency between
> platforms is the biggest problem for me.

As I said previsously, pm_runtime should fix these issues.

Benoit


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 12:12     ` Cousson, Benoit
@ 2011-03-30 12:58       ` Tomi Valkeinen
  2011-03-30 13:21         ` Cousson, Benoit
  2011-04-02  2:12         ` Paul Walmsley
  0 siblings, 2 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-03-30 12:58 UTC (permalink / raw)
  To: Cousson, Benoit; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: text/plain, Size: 6771 bytes --]

On Wed, 2011-03-30 at 14:12 +0200, Cousson, Benoit wrote:
> On 3/30/2011 1:03 PM, Valkeinen, Tomi wrote:
> > On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
> >> Hi Tomi,
> >>
> >> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
> >>> Hi Benoit, Paul,
> >>>
> >>> I've been discussing with Sumit and Archit to understand how the DSS
> >>> clocks are set up on OMAP4. I think I now have some idea how things
> >>> work, but I'm still at loss why things are the way they are.
> >>>
> >>> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
> >>> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
> >>> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
> >>> controllable, but it is affected by MODULEMODE bit.
> >>>
> >>> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
> >>> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
> >>> the TRM's DSS_FCLK.
> >>>
> >>> Was that correct?
> >>
> >> Yes. For the moment, but this is not the final state.
> >>
> >>> If so, from DSS driver's perspective, the dss_fck sounds very much like
> >>> an interface clock (it's always needed when DSS is used) and dss_dss_clk
> >>> sounds very much like functional clock (it's always needed, except if
> >>> DSI PLL is used for DSS functional clock).
> 
> dss_dss_fck is one of the possible functional clocks, hence the optional 
> attribute. You can run the DSS only for sys_clk is you want.

We can? I remember this was possible on OMAP2, but I can't seem to find
it on OMAP4 TRM...

Ah right, you mean sys_clk goes to DSI PLL, and the output from DSI PLL
can be used as functional clock?

We _always_ need DSS_FCLK to get DSS up and running, and to configure
DSI PLL if we want to get the clocks from there. So it's not quite that
optional. But it's true that we can turn it off later.

> That's why the hwmod fmwk cannot choose for you which one you will need 
> depending of your panel. It is up to the driver to select the correct one.

But isn't that DSS internal thing? (I'm looking again at the DSS clock
tree figure). DSS_FCLK from the PRCM should always be the same from
DSS's point of view, it doesn't change. If we use the clock from DSI
PLL, we'll get clock for LCD2_CLK, LCD1_CLK and DISPC_FCLK. But
DSS_FCLK/DSS_CLK is always the same.

> >>> If "dss_fck" would control DSS_FCLK and "dss_ick" would control
> >>> MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
> >>> and we wouldn't need any omap4 spesific trickery in the DSS driver.
> >>> ("dss_dss_clk" wouldn't be needed).
> >>
> >> You cannot play with iclk, because this clock is supposed to be handled
> >> automatically by the HW. This was the case on OMAP2&  3 as well BTW.
> >
> > Right.
> >
> > But now we have 1) dss_fck, which isn't the DSS_FCLK in TRM, and in fact
> > not fck at all, or even clock at all 2) dss_dss_clk, a new clock whose
> > name doesn't match to anything in TRM, and is in fact the DSS_FCLK.
> >
> > So they both sound like they are confusingly named.
> 
> The naming convention is simple: opt clock are using the module name + 
> the original clock name: "dss_XXX", whereas the modulemode is using the 
> module name + fck, because it is for the moment similar to the fclk we 
> have on simpler module. iclk_en is not exposed at all on OMAP4.
> 
> optional clocks:
> 
> static struct clk dss_sys_clk = {
> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
> 	.enable_bit	= OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT,
> 
> static struct clk dss_tv_clk = {
> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
> 	.enable_bit	= OMAP4430_OPTFCLKEN_TV_CLK_SHIFT,
> 
> static struct clk dss_dss_clk = {
> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
> 	.enable_bit	= OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,
> 
> static struct clk dss_48mhz_clk = {
> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
> 	.enable_bit	= OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,
> 
> 
> MODULEMODE:
> 
> static struct clk dss_fck = {
> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
> 	.enable_bit	= OMAP4430_MODULEMODE_SWCTRL,

Okay, the naming makes sense now that you explained the convention.

I think I'm finally starting to get this =).

> > If we had dss_fck matching to DSS_FCLK and dss_ick for MODULEMODE, they
> > would, in my opinion, be much more understandable and in many ways
> > relate to the way things are in the HW. Additionally this would match
> > the way clocks are on OMAP2/3 and things would just work.
> 
> No, because you should not have to play with iclk at all.
> BTW, for my point of view you have such issue because your are still not 
> using the pm_runtime API.
> As soon as you will switch to pm_runtime, iclk_en and fclk_en (OMAP2&3 
> name) or MODULEMODE will be handle by the fmwk. The driver will just 
> have to handle the optional clock.
> 
> > So while I understand that neither the current way and my suggestion
> > exactly match the HW, and also that things are not ready yet and the
> > clocks will change, I don't understand why such a strange method to name
> > the clocks was used, when there's a simpler and backward compatible way.
> 
> The point is that this automated method works for every IPs in the OMAP 
> except the DSS that is not managing its clocks like other modules.

With this do you mean that the SW does not manage clocks like other
modules (should use pm_runtime?), or the HW is somehow different?

> Moreover, since the clock fmwk is creating aliases for these clock 
> nodes, you should never see at all that dss_dss_clk node that seems to 
> bother you.

Oh, that doesn't bother me =). What bothers me is that DSS did not
suddenly work because the clocks were set up in this manner.

Perhaps the aliases should have been setup differently, at least
temporarily, to get things working more easily.

Currently we have these aliases for OMAP4:

"dss_clk" -> dss_dss_clk
"fck" -> dss_fck
"ick" -> dummy_ck

If that would be changed to:

"fck" -> dss_dss_clk
"ick -> dss_fck

The driver would work the same way for all OMAPs.

> > And if this current way to handle OMAP4 DSS clocks is for some reason
> > better and can't be changed, could the OMAP2/3 clocks also be changed to
> > keep things consistent between OMAPs? Because the inconsistency between
> > platforms is the biggest problem for me.
> 
> As I said previsously, pm_runtime should fix these issues.

Ok. I really need to find time to look at that. Sumit has been working
on it, I hope it'll be ready soon =).

Anyway. To get things working for rc2 (DSS currently crashes due to not
enabling dss_clk) we need to either:
1) Change the clock aliases as above
2) Add something like Sumit's patch (attached) to handle dss_clk. While
the patch is not that complex, it feels rather hacky.

What's your opinion?

 Tomi


[-- Attachment #2: 0001-OMAP4-DSS2-add-dss_dss_clk.patch --]
[-- Type: text/x-patch, Size: 2955 bytes --]

>From 0722361a0921296c980cb9011dad42f56c929007 Mon Sep 17 00:00:00 2001
From: Sumit Semwal <sumit.semwal@ti.com>
Date: Tue, 1 Mar 2011 14:23:09 +0530
Subject: [PATCH] OMAP4:DSS2: add dss_dss_clk.

dss_dss_clk is a new clock needed in OMAP4 as an opt-clock.
Adding the same in dss clock handling.

Signed-off-by: Sumit Semwal <sumit.semwal@ti.com>
---
 drivers/video/omap2/dss/dss.c |   33 ++++++++++++++++++++++++++++++---
 1 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c
index 3d0277d..6c1a090 100644
--- a/drivers/video/omap2/dss/dss.c
+++ b/drivers/video/omap2/dss/dss.c
@@ -67,6 +67,7 @@ static struct {
 	struct clk	*dss_sys_clk;
 	struct clk	*dss_tv_fck;
 	struct clk	*dss_video_fck;
+	struct clk	*dss_dss_clk;
 	unsigned	num_clks_enabled;
 
 	unsigned long	cache_req_pck;
@@ -706,6 +707,7 @@ static int dss_get_clocks(void)
 	dss.dss_sys_clk = NULL;
 	dss.dss_tv_fck = NULL;
 	dss.dss_video_fck = NULL;
+	dss.dss_dss_clk	= NULL;
 
 	r = dss_get_clock(&dss.dss_ick, "ick");
 	if (r)
@@ -738,6 +740,12 @@ static int dss_get_clocks(void)
 			goto err;
 	}
 
+	if (pdata->opt_clock_available("dss_clk")) {
+		r = dss_get_clock(&dss.dss_dss_clk, "dss_clk");
+		if (r)
+			goto err;
+	}
+
 	return 0;
 
 err:
@@ -751,7 +759,8 @@ err:
 		clk_put(dss.dss_tv_fck);
 	if (dss.dss_video_fck)
 		clk_put(dss.dss_video_fck);
-
+	if (dss.dss_dss_clk)
+		clk_put(dss.dss_dss_clk);
 	return r;
 }
 
@@ -763,6 +772,8 @@ static void dss_put_clocks(void)
 		clk_put(dss.dss_tv_fck);
 	if (dss.dss_sys_clk)
 		clk_put(dss.dss_sys_clk);
+	if (dss.dss_dss_clk)
+		clk_put(dss.dss_dss_clk);
 	clk_put(dss.dss_fck);
 	clk_put(dss.dss_ick);
 }
@@ -810,8 +821,16 @@ static void dss_clk_enable_no_ctx(enum dss_clock clks)
 
 	if (clks & DSS_CLK_ICK)
 		clk_enable(dss.dss_ick);
-	if (clks & DSS_CLK_FCK)
+	/*
+	 * XXX: tie dss_dss_clk to FCK - this will change with following
+	 * pm_runtime patches. Needed for OMAP4 boot up due to stricter
+	 * clock cutting in pm framework post 2.6.38-rc5.
+	 */
+	if (clks & DSS_CLK_FCK) {
 		clk_enable(dss.dss_fck);
+		if (dss.dss_dss_clk)
+			clk_enable(dss.dss_dss_clk);
+	}
 	if ((clks & DSS_CLK_SYSCK) && dss.dss_sys_clk)
 		clk_enable(dss.dss_sys_clk);
 	if ((clks & DSS_CLK_TVFCK) && dss.dss_tv_fck)
@@ -838,8 +857,16 @@ static void dss_clk_disable_no_ctx(enum dss_clock clks)
 
 	if (clks & DSS_CLK_ICK)
 		clk_disable(dss.dss_ick);
-	if (clks & DSS_CLK_FCK)
+        /*
+         * XXX: tie dss_dss_clk to FCK - this will change with following
+         * pm_runtime patches. Needed for OMAP4 boot up due to stricter
+         * clock cutting in pm framework post 2.6.38-rc5.
+         */
+	if (clks & DSS_CLK_FCK) {
 		clk_disable(dss.dss_fck);
+		if (dss.dss_dss_clk)
+			clk_disable(dss.dss_dss_clk);
+	}
 	if ((clks & DSS_CLK_SYSCK) && dss.dss_sys_clk)
 		clk_disable(dss.dss_sys_clk);
 	if ((clks & DSS_CLK_TVFCK) && dss.dss_tv_fck)
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 12:58       ` Tomi Valkeinen
@ 2011-03-30 13:21         ` Cousson, Benoit
  2011-03-31  6:42           ` Archit Taneja
  2011-03-31  7:34           ` Tomi Valkeinen
  2011-04-02  2:12         ` Paul Walmsley
  1 sibling, 2 replies; 29+ messages in thread
From: Cousson, Benoit @ 2011-03-30 13:21 UTC (permalink / raw)
  To: Valkeinen, Tomi; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

On 3/30/2011 2:58 PM, Valkeinen, Tomi wrote:
> On Wed, 2011-03-30 at 14:12 +0200, Cousson, Benoit wrote:
>> On 3/30/2011 1:03 PM, Valkeinen, Tomi wrote:
>>> On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
>>>> Hi Tomi,
>>>>
>>>> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
>>>>> Hi Benoit, Paul,
>>>>>
>>>>> I've been discussing with Sumit and Archit to understand how the DSS
>>>>> clocks are set up on OMAP4. I think I now have some idea how things
>>>>> work, but I'm still at loss why things are the way they are.
>>>>>
>>>>> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
>>>>> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
>>>>> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
>>>>> controllable, but it is affected by MODULEMODE bit.
>>>>>
>>>>> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
>>>>> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
>>>>> the TRM's DSS_FCLK.
>>>>>
>>>>> Was that correct?
>>>>
>>>> Yes. For the moment, but this is not the final state.
>>>>
>>>>> If so, from DSS driver's perspective, the dss_fck sounds very much like
>>>>> an interface clock (it's always needed when DSS is used) and dss_dss_clk
>>>>> sounds very much like functional clock (it's always needed, except if
>>>>> DSI PLL is used for DSS functional clock).
>>
>> dss_dss_fck is one of the possible functional clocks, hence the optional
>> attribute. You can run the DSS only for sys_clk is you want.
>
> We can? I remember this was possible on OMAP2, but I can't seem to find
> it on OMAP4 TRM...
>
> Ah right, you mean sys_clk goes to DSI PLL, and the output from DSI PLL
> can be used as functional clock?

Yes, you're right, maybe we can still use the sys_clk directly with a 
parallel QVGA LCD like on OMAP2:-)

> We _always_ need DSS_FCLK to get DSS up and running, and to configure
> DSI PLL if we want to get the clocks from there. So it's not quite that
> optional. But it's true that we can turn it off later.

Yes, that was confirmed by HW folks, as soon as you have one functional 
clock active, you can disable the other one.

>> That's why the hwmod fmwk cannot choose for you which one you will need
>> depending of your panel. It is up to the driver to select the correct one.
>
> But isn't that DSS internal thing? (I'm looking again at the DSS clock
> tree figure). DSS_FCLK from the PRCM should always be the same from
> DSS's point of view, it doesn't change. If we use the clock from DSI
> PLL, we'll get clock for LCD2_CLK, LCD1_CLK and DISPC_FCLK. But
> DSS_FCLK/DSS_CLK is always the same.

Yes, but there is no other need for the DSS_CLK beside these internal 
nodes and the DSI engines. So you can shut it down as soon as an 
alternate clock is available (PLL1_CLK1 or PLL2_CLK1 in your case).

>>>>> If "dss_fck" would control DSS_FCLK and "dss_ick" would control
>>>>> MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
>>>>> and we wouldn't need any omap4 spesific trickery in the DSS driver.
>>>>> ("dss_dss_clk" wouldn't be needed).
>>>>
>>>> You cannot play with iclk, because this clock is supposed to be handled
>>>> automatically by the HW. This was the case on OMAP2&   3 as well BTW.
>>>
>>> Right.
>>>
>>> But now we have 1) dss_fck, which isn't the DSS_FCLK in TRM, and in fact
>>> not fck at all, or even clock at all 2) dss_dss_clk, a new clock whose
>>> name doesn't match to anything in TRM, and is in fact the DSS_FCLK.
>>>
>>> So they both sound like they are confusingly named.
>>
>> The naming convention is simple: opt clock are using the module name +
>> the original clock name: "dss_XXX", whereas the modulemode is using the
>> module name + fck, because it is for the moment similar to the fclk we
>> have on simpler module. iclk_en is not exposed at all on OMAP4.
>>
>> optional clocks:
>>
>> static struct clk dss_sys_clk = {
>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>> 	.enable_bit	= OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT,
>>
>> static struct clk dss_tv_clk = {
>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>> 	.enable_bit	= OMAP4430_OPTFCLKEN_TV_CLK_SHIFT,
>>
>> static struct clk dss_dss_clk = {
>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>> 	.enable_bit	= OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,
>>
>> static struct clk dss_48mhz_clk = {
>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>> 	.enable_bit	= OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,
>>
>>
>> MODULEMODE:
>>
>> static struct clk dss_fck = {
>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>> 	.enable_bit	= OMAP4430_MODULEMODE_SWCTRL,
>
> Okay, the naming makes sense now that you explained the convention.
>
> I think I'm finally starting to get this =).
>
>>> If we had dss_fck matching to DSS_FCLK and dss_ick for MODULEMODE, they
>>> would, in my opinion, be much more understandable and in many ways
>>> relate to the way things are in the HW. Additionally this would match
>>> the way clocks are on OMAP2/3 and things would just work.
>>
>> No, because you should not have to play with iclk at all.
>> BTW, for my point of view you have such issue because your are still not
>> using the pm_runtime API.
>> As soon as you will switch to pm_runtime, iclk_en and fclk_en (OMAP2&3
>> name) or MODULEMODE will be handle by the fmwk. The driver will just
>> have to handle the optional clock.
>>
>>> So while I understand that neither the current way and my suggestion
>>> exactly match the HW, and also that things are not ready yet and the
>>> clocks will change, I don't understand why such a strange method to name
>>> the clocks was used, when there's a simpler and backward compatible way.
>>
>> The point is that this automated method works for every IPs in the OMAP
>> except the DSS that is not managing its clocks like other modules.
>
> With this do you mean that the SW does not manage clocks like other
> modules (should use pm_runtime?), or the HW is somehow different?
>
>> Moreover, since the clock fmwk is creating aliases for these clock
>> nodes, you should never see at all that dss_dss_clk node that seems to
>> bother you.
>
> Oh, that doesn't bother me =). What bothers me is that DSS did not
> suddenly work because the clocks were set up in this manner.
>
> Perhaps the aliases should have been setup differently, at least
> temporarily, to get things working more easily.
>
> Currently we have these aliases for OMAP4:
>
> "dss_clk" ->  dss_dss_clk
> "fck" ->  dss_fck
> "ick" ->  dummy_ck
>
> If that would be changed to:
>
> "fck" ->  dss_dss_clk
> "ick ->  dss_fck
>
> The driver would work the same way for all OMAPs.
>
>>> And if this current way to handle OMAP4 DSS clocks is for some reason
>>> better and can't be changed, could the OMAP2/3 clocks also be changed to
>>> keep things consistent between OMAPs? Because the inconsistency between
>>> platforms is the biggest problem for me.
>>
>> As I said previsously, pm_runtime should fix these issues.
>
> Ok. I really need to find time to look at that. Sumit has been working
> on it, I hope it'll be ready soon =).
>
> Anyway. To get things working for rc2 (DSS currently crashes due to not
> enabling dss_clk) we need to either:
> 1) Change the clock aliases as above

Changing the clock alias for my point of view is like hacking the HW 
definition to fit your need. Even if this is temporary, I do not like 
that approach.

> 2) Add something like Sumit's patch (attached) to handle dss_clk. While
> the patch is not that complex, it feels rather hacky.

Yes, I'd rather hack that issue internally, because this is something 
you should fix as soon as you switch to PM runtime.

> What's your opinion?

Definitively #2.

Benoit



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 13:21         ` Cousson, Benoit
@ 2011-03-31  6:42           ` Archit Taneja
  2011-03-31  9:36             ` Cousson, Benoit
  2011-03-31  7:34           ` Tomi Valkeinen
  1 sibling, 1 reply; 29+ messages in thread
From: Archit Taneja @ 2011-03-31  6:42 UTC (permalink / raw)
  To: Cousson, Benoit; +Cc: Valkeinen, Tomi, Paul Walmsley, Semwal, Sumit, linux-omap

On Wednesday 30 March 2011 06:51 PM, Cousson, Benoit wrote:
> On 3/30/2011 2:58 PM, Valkeinen, Tomi wrote:
>> On Wed, 2011-03-30 at 14:12 +0200, Cousson, Benoit wrote:
>>> On 3/30/2011 1:03 PM, Valkeinen, Tomi wrote:
>>>> On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
>>>>> Hi Tomi,
>>>>>
>>>>> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
>>>>>> Hi Benoit, Paul,
>>>>>>
>>>>>> I've been discussing with Sumit and Archit to understand how the DSS
>>>>>> clocks are set up on OMAP4. I think I now have some idea how things
>>>>>> work, but I'm still at loss why things are the way they are.
>>>>>>
>>>>>> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
>>>>>> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
>>>>>> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
>>>>>> controllable, but it is affected by MODULEMODE bit.
>>>>>>
>>>>>> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
>>>>>> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
>>>>>> the TRM's DSS_FCLK.
>>>>>>
>>>>>> Was that correct?
>>>>>
>>>>> Yes. For the moment, but this is not the final state.
>>>>>
>>>>>> If so, from DSS driver's perspective, the dss_fck sounds very much like
>>>>>> an interface clock (it's always needed when DSS is used) and dss_dss_clk
>>>>>> sounds very much like functional clock (it's always needed, except if
>>>>>> DSI PLL is used for DSS functional clock).
>>>
>>> dss_dss_fck is one of the possible functional clocks, hence the optional
>>> attribute. You can run the DSS only for sys_clk is you want.
>>
>> We can? I remember this was possible on OMAP2, but I can't seem to find
>> it on OMAP4 TRM...
>>
>> Ah right, you mean sys_clk goes to DSI PLL, and the output from DSI PLL
>> can be used as functional clock?
>
> Yes, you're right, maybe we can still use the sys_clk directly with a
> parallel QVGA LCD like on OMAP2:-)
>
>> We _always_ need DSS_FCLK to get DSS up and running, and to configure
>> DSI PLL if we want to get the clocks from there. So it's not quite that
>> optional. But it's true that we can turn it off later.

Just wanted to clarify the issue for myself and summarise:

hwmod and pm runtime ensures that the MODULEMODE bits are set, and 
technically, that should be enough for a module to get up and running. 
But because of the strange design of DSS HW, we need an additional clock 
(DSS_CLK at bootup, could be something else later on) to access DSS 
registers. So we need to enable dss_dss_fclk in our driver in the 
beginning itself to access a register, hence Sumit's patch is needed.

The strange thing is that if dss_dss_fclk is 
off(OMAP4430_OPTFCLKEN_DSSCLK bit is 0) it doesn't mean that the clock 
is surely OFF. Its only OFF when the DPLL per m5x2 divider allows HW 
auto-gating of the clock.

So OPTCLKEN_DSSCLK is in a way a dummy bit which when set, ensures that 
the M5 divider doesn't auto gate. So it isn't exactly a enable/disable bit.

In our tree(2.6.38-rc series), HW auto gating bit was disabled for m5x2 
divider, and hence, it never mattered to us if OPTCLKEN_DSSCLK was 
enabled or disabled. We went on happily without bothering about this opt 
clock.

When things got merged in mainline, the HW auto gating for m5x2 came 
into picture(HSDIVIDER_CLKOUT2_GATE_CTRL in CM_DIV_M5_DPLL_PER), and 
then suddenly dss_dss_fclk became super crucial, and a register access 
depended on it. This was the main reason of the confusion I guess.

Archit

>
> Yes, that was confirmed by HW folks, as soon as you have one functional
> clock active, you can disable the other one.
>
>>> That's why the hwmod fmwk cannot choose for you which one you will need
>>> depending of your panel. It is up to the driver to select the correct one.
>>
>> But isn't that DSS internal thing? (I'm looking again at the DSS clock
>> tree figure). DSS_FCLK from the PRCM should always be the same from
>> DSS's point of view, it doesn't change. If we use the clock from DSI
>> PLL, we'll get clock for LCD2_CLK, LCD1_CLK and DISPC_FCLK. But
>> DSS_FCLK/DSS_CLK is always the same.
>
> Yes, but there is no other need for the DSS_CLK beside these internal
> nodes and the DSI engines. So you can shut it down as soon as an
> alternate clock is available (PLL1_CLK1 or PLL2_CLK1 in your case).
>
>>>>>> If "dss_fck" would control DSS_FCLK and "dss_ick" would control
>>>>>> MODULEMODE, they would be about the same as the clocks in OMAP2 and 3,
>>>>>> and we wouldn't need any omap4 spesific trickery in the DSS driver.
>>>>>> ("dss_dss_clk" wouldn't be needed).
>>>>>
>>>>> You cannot play with iclk, because this clock is supposed to be handled
>>>>> automatically by the HW. This was the case on OMAP2&    3 as well BTW.
>>>>
>>>> Right.
>>>>
>>>> But now we have 1) dss_fck, which isn't the DSS_FCLK in TRM, and in fact
>>>> not fck at all, or even clock at all 2) dss_dss_clk, a new clock whose
>>>> name doesn't match to anything in TRM, and is in fact the DSS_FCLK.
>>>>
>>>> So they both sound like they are confusingly named.
>>>
>>> The naming convention is simple: opt clock are using the module name +
>>> the original clock name: "dss_XXX", whereas the modulemode is using the
>>> module name + fck, because it is for the moment similar to the fclk we
>>> have on simpler module. iclk_en is not exposed at all on OMAP4.
>>>
>>> optional clocks:
>>>
>>> static struct clk dss_sys_clk = {
>>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>>> 	.enable_bit	= OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT,
>>>
>>> static struct clk dss_tv_clk = {
>>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>>> 	.enable_bit	= OMAP4430_OPTFCLKEN_TV_CLK_SHIFT,
>>>
>>> static struct clk dss_dss_clk = {
>>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>>> 	.enable_bit	= OMAP4430_OPTFCLKEN_DSSCLK_SHIFT,
>>>
>>> static struct clk dss_48mhz_clk = {
>>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>>> 	.enable_bit	= OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT,
>>>
>>>
>>> MODULEMODE:
>>>
>>> static struct clk dss_fck = {
>>> 	.enable_reg	= OMAP4430_CM_DSS_DSS_CLKCTRL,
>>> 	.enable_bit	= OMAP4430_MODULEMODE_SWCTRL,
>>
>> Okay, the naming makes sense now that you explained the convention.
>>
>> I think I'm finally starting to get this =).
>>
>>>> If we had dss_fck matching to DSS_FCLK and dss_ick for MODULEMODE, they
>>>> would, in my opinion, be much more understandable and in many ways
>>>> relate to the way things are in the HW. Additionally this would match
>>>> the way clocks are on OMAP2/3 and things would just work.
>>>
>>> No, because you should not have to play with iclk at all.
>>> BTW, for my point of view you have such issue because your are still not
>>> using the pm_runtime API.
>>> As soon as you will switch to pm_runtime, iclk_en and fclk_en (OMAP2&3
>>> name) or MODULEMODE will be handle by the fmwk. The driver will just
>>> have to handle the optional clock.
>>>
>>>> So while I understand that neither the current way and my suggestion
>>>> exactly match the HW, and also that things are not ready yet and the
>>>> clocks will change, I don't understand why such a strange method to name
>>>> the clocks was used, when there's a simpler and backward compatible way.
>>>
>>> The point is that this automated method works for every IPs in the OMAP
>>> except the DSS that is not managing its clocks like other modules.
>>
>> With this do you mean that the SW does not manage clocks like other
>> modules (should use pm_runtime?), or the HW is somehow different?
>>
>>> Moreover, since the clock fmwk is creating aliases for these clock
>>> nodes, you should never see at all that dss_dss_clk node that seems to
>>> bother you.
>>
>> Oh, that doesn't bother me =). What bothers me is that DSS did not
>> suddenly work because the clocks were set up in this manner.
>>
>> Perhaps the aliases should have been setup differently, at least
>> temporarily, to get things working more easily.
>>
>> Currently we have these aliases for OMAP4:
>>
>> "dss_clk" ->   dss_dss_clk
>> "fck" ->   dss_fck
>> "ick" ->   dummy_ck
>>
>> If that would be changed to:
>>
>> "fck" ->   dss_dss_clk
>> "ick ->   dss_fck
>>
>> The driver would work the same way for all OMAPs.
>>
>>>> And if this current way to handle OMAP4 DSS clocks is for some reason
>>>> better and can't be changed, could the OMAP2/3 clocks also be changed to
>>>> keep things consistent between OMAPs? Because the inconsistency between
>>>> platforms is the biggest problem for me.
>>>
>>> As I said previsously, pm_runtime should fix these issues.
>>
>> Ok. I really need to find time to look at that. Sumit has been working
>> on it, I hope it'll be ready soon =).
>>
>> Anyway. To get things working for rc2 (DSS currently crashes due to not
>> enabling dss_clk) we need to either:
>> 1) Change the clock aliases as above
>
> Changing the clock alias for my point of view is like hacking the HW
> definition to fit your need. Even if this is temporary, I do not like
> that approach.
>
>> 2) Add something like Sumit's patch (attached) to handle dss_clk. While
>> the patch is not that complex, it feels rather hacky.
>
> Yes, I'd rather hack that issue internally, because this is something
> you should fix as soon as you switch to PM runtime.
>
>> What's your opinion?
>
> Definitively #2.
>
> Benoit
>
>


^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 13:21         ` Cousson, Benoit
  2011-03-31  6:42           ` Archit Taneja
@ 2011-03-31  7:34           ` Tomi Valkeinen
  1 sibling, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-03-31  7:34 UTC (permalink / raw)
  To: Cousson, Benoit; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

On Wed, 2011-03-30 at 15:21 +0200, Cousson, Benoit wrote:
> On 3/30/2011 2:58 PM, Valkeinen, Tomi wrote:

> > Anyway. To get things working for rc2 (DSS currently crashes due to not
> > enabling dss_clk) we need to either:
> > 1) Change the clock aliases as above
> 
> Changing the clock alias for my point of view is like hacking the HW 
> definition to fit your need. Even if this is temporary, I do not like 
> that approach.
> 
> > 2) Add something like Sumit's patch (attached) to handle dss_clk. While
> > the patch is not that complex, it feels rather hacky.
> 
> Yes, I'd rather hack that issue internally, because this is something 
> you should fix as soon as you switch to PM runtime.
> 
> > What's your opinion?
> 
> Definitively #2.

Ok, let's go with that. I don't like it but hopefully pm_runtime will
clear the mess from dss driver.

Thanks for your time explaining the clock setup to me =)

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-31  6:42           ` Archit Taneja
@ 2011-03-31  9:36             ` Cousson, Benoit
  0 siblings, 0 replies; 29+ messages in thread
From: Cousson, Benoit @ 2011-03-31  9:36 UTC (permalink / raw)
  To: Taneja, Archit; +Cc: Valkeinen, Tomi, Paul Walmsley, Semwal, Sumit, linux-omap

Hi Archit,

On 3/31/2011 8:42 AM, Taneja, Archit wrote:
> On Wednesday 30 March 2011 06:51 PM, Cousson, Benoit wrote:
>> On 3/30/2011 2:58 PM, Valkeinen, Tomi wrote:
>>> On Wed, 2011-03-30 at 14:12 +0200, Cousson, Benoit wrote:
>>>> On 3/30/2011 1:03 PM, Valkeinen, Tomi wrote:
>>>>> On Wed, 2011-03-30 at 11:32 +0200, Cousson, Benoit wrote:
>>>>>> Hi Tomi,
>>>>>>
>>>>>> On 3/30/2011 8:48 AM, Valkeinen, Tomi wrote:
>>>>>>> Hi Benoit, Paul,
>>>>>>>
>>>>>>> I've been discussing with Sumit and Archit to understand how the DSS
>>>>>>> clocks are set up on OMAP4. I think I now have some idea how things
>>>>>>> work, but I'm still at loss why things are the way they are.
>>>>>>>
>>>>>>> So, if I look at OMAP4 TRM, Figure 10-4 DSS Clock Tree, there are two
>>>>>>> clocks in PRCM block that are relevant to this discussion: DSS_L3_ICLK
>>>>>>> and DSS_FCLK. To my understanding DSS_L3_ICLK is not really
>>>>>>> controllable, but it is affected by MODULEMODE bit.
>>>>>>>
>>>>>>> Then we have two relevant clocks defined in clock44xx_data.c: dss_fck
>>>>>>> and dss_dss_clk. dss_fck controls the MODULEMODE bit, and dss_dss_clk is
>>>>>>> the TRM's DSS_FCLK.
>>>>>>>
>>>>>>> Was that correct?
>>>>>>
>>>>>> Yes. For the moment, but this is not the final state.
>>>>>>
>>>>>>> If so, from DSS driver's perspective, the dss_fck sounds very much like
>>>>>>> an interface clock (it's always needed when DSS is used) and dss_dss_clk
>>>>>>> sounds very much like functional clock (it's always needed, except if
>>>>>>> DSI PLL is used for DSS functional clock).
>>>>
>>>> dss_dss_fck is one of the possible functional clocks, hence the optional
>>>> attribute. You can run the DSS only for sys_clk is you want.
>>>
>>> We can? I remember this was possible on OMAP2, but I can't seem to find
>>> it on OMAP4 TRM...
>>>
>>> Ah right, you mean sys_clk goes to DSI PLL, and the output from DSI PLL
>>> can be used as functional clock?
>>
>> Yes, you're right, maybe we can still use the sys_clk directly with a
>> parallel QVGA LCD like on OMAP2:-)
>>
>>> We _always_ need DSS_FCLK to get DSS up and running, and to configure
>>> DSI PLL if we want to get the clocks from there. So it's not quite that
>>> optional. But it's true that we can turn it off later.
>
> Just wanted to clarify the issue for myself and summarise:
>
> hwmod and pm runtime ensures that the MODULEMODE bits are set, and
> technically, that should be enough for a module to get up and running.
> But because of the strange design of DSS HW, we need an additional clock
> (DSS_CLK at bootup, could be something else later on) to access DSS
> registers. So we need to enable dss_dss_fclk in our driver in the
> beginning itself to access a register, hence Sumit's patch is needed.
>
> The strange thing is that if dss_dss_fclk is
> off(OMAP4430_OPTFCLKEN_DSSCLK bit is 0) it doesn't mean that the clock
> is surely OFF. Its only OFF when the DPLL per m5x2 divider allows HW
> auto-gating of the clock.

Hehe, welcome to the PRCM world :-)

> So OPTCLKEN_DSSCLK is in a way a dummy bit which when set, ensures that
> the M5 divider doesn't auto gate. So it isn't exactly a enable/disable bit.

It is the case for most clocks in the system. You know when it is 
enabled, but it will be disabled only when the clock domain or in that 
case the parent clock will do HW auto gating.
In this case there is no intermediate gating because the DSS_CLK is the 
only user of the M5 HW divider output, so gating only the parent is enough.

> In our tree(2.6.38-rc series), HW auto gating bit was disabled for m5x2
> divider, and hence, it never mattered to us if OPTCLKEN_DSSCLK was
> enabled or disabled. We went on happily without bothering about this opt
> clock.
>
> When things got merged in mainline, the HW auto gating for m5x2 came
> into picture(HSDIVIDER_CLKOUT2_GATE_CTRL in CM_DIV_M5_DPLL_PER), and
> then suddenly dss_dss_fclk became super crucial, and a register access
> depended on it. This was the main reason of the confusion I guess.

That make sense now, in theory, all these HS divider should be autogated 
by default, it was not the case previously because we were still in a 
non-PM optimize mode. That's why you have to control the clock at your 
level to ensure that the HW will not gate the parent clock.

Benoit

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-03-30 12:58       ` Tomi Valkeinen
  2011-03-30 13:21         ` Cousson, Benoit
@ 2011-04-02  2:12         ` Paul Walmsley
  2011-04-04  6:53           ` Tomi Valkeinen
  1 sibling, 1 reply; 29+ messages in thread
From: Paul Walmsley @ 2011-04-02  2:12 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1983 bytes --]

Hi Tomi, Benoît, et al,

On Wed, 30 Mar 2011, Tomi Valkeinen wrote:

> Currently we have these aliases for OMAP4:
> 
> "dss_clk" -> dss_dss_clk
> "fck" -> dss_fck
> "ick" -> dummy_ck
>
> If that would be changed to:
>
> "fck" -> dss_dss_clk
> "ick -> dss_fck
>
> The driver would work the same way for all OMAPs.

This looks reasonable to me, and seems to match the TRM's Figure 10-4 "DSS 
Clock Tree".

The current OMAP4 clock data name "dss_fck" is just kind of a fake name 
for that clock in the OMAP4 context.

> Anyway. To get things working for rc2 (DSS currently crashes due to not
> enabling dss_clk) we need to either:
> 1) Change the clock aliases as above
> 2) Add something like Sumit's patch (attached) to handle dss_clk. While
> the patch is not that complex, it feels rather hacky.

Yeah, that patch looks like a hack to me, especially something like 
this:

+       if (pdata->opt_clock_available("dss_clk")) {

Based on the E-mail thread so far, I'd say that changing the clock aliases 
is the way to go for right now.  The clock aliases are not hardware data; 
they just control how the clock hardware is mapped to the drivers.

Of course, at some point soon, those clock aliases are going to go away.  
But hopefully you all will have converted the driver over to PM runtime at 
that point.

Once that happens, there's another problem: omap_hwmod_enable() is defined 
that the hardware registers should be accessible by the MPU after it 
completes.  So by that definition, the hwmod code should be 
enabling/disabling that dss_clk clock too when it enables/idles/shuts down 
the hwmod.  Probably we'd need to mark that struct omap_hwmod_opt_clk with 
some flag.  Then we'd need some kind of way for the DSS to tell the hwmod 
code whether it is or isn't reliant on the PRCM-provided functional clock 
for its internal functional clock.  Maybe something like 
omap_hwmod_{release,require}_system_fclk()?


- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-02  2:12         ` Paul Walmsley
@ 2011-04-04  6:53           ` Tomi Valkeinen
  2011-04-06  9:09             ` Tomi Valkeinen
                               ` (2 more replies)
  0 siblings, 3 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-04  6:53 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Paul, Benoit,

On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:

> Based on the E-mail thread so far, I'd say that changing the clock aliases 
> is the way to go for right now.  The clock aliases are not hardware data; 
> they just control how the clock hardware is mapped to the drivers.

I'd very much prefer this option. Below is a patch for this.

If Benoit doesn't complain too much about this, I'd like to get this
merged as soon as possible, as OMAP4 DSS is currently crashing in the
mainline kernel.

I can either handle it myself if I get your acks, or you can send a pull
request for this if you have some other patches going in also.

> Of course, at some point soon, those clock aliases are going to go away.  
> But hopefully you all will have converted the driver over to PM runtime at 
> that point.
> 
> Once that happens, there's another problem: omap_hwmod_enable() is defined 
> that the hardware registers should be accessible by the MPU after it 
> completes.  So by that definition, the hwmod code should be 
> enabling/disabling that dss_clk clock too when it enables/idles/shuts down 
> the hwmod.  Probably we'd need to mark that struct omap_hwmod_opt_clk with 
> some flag.  Then we'd need some kind of way for the DSS to tell the hwmod 
> code whether it is or isn't reliant on the PRCM-provided functional clock 
> for its internal functional clock.  Maybe something like 
> omap_hwmod_{release,require}_system_fclk()?

Hmm, right. I guess no other HW module has clock setups like this?

Currently DSS can use clk_enable/disable() for the system fclk when its
using DSI PLL for the fclk. So omap_hwmod_{release,require}_system_fclk
sounds like a simple solution to this.

Not directly related, but something I've been wondering about is how to
abstract the DSI/HDMI PLLs in DSS. What do you think, would it be
possible/worth it to create struct clks for the clocks coming out of
those PLLs? These would, of course, be DSS internal clks. I'm not very
familiar with the clock framework, so I don't really have any idea what
this would require and what would be the pros and cons.

---

>From f9999ceb48b2e22217dccc85b33362b6a17e5a00 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@ti.com>
Date: Mon, 4 Apr 2011 09:26:19 +0300
Subject: [PATCH] OMAP4: clock data: Change DSS clock aliases

DSS driver has used fck and ick clocks on OMAP2/3 to get DSS HW up and
running, and also to get the pixel clock's source clock rate from the
fck.

On OMAP4 the clock data is set up in a different way, as there's no ick,
dss_fck points to a fake clock which just affects DSS's MODULEMODE, and
dss_dss_clk if the DSS_FCK.

>From DSS driver's point of view the dss_fck sounds like an ick, and
dss_dss_clk is the fck. While this is not entirely correct from HW point
of view, especially for the ick, configuring the clock aliases that way
makes DSS "just work" with OMAP4's clock setup.

In the (hopefully near) future DSS driver will be reworked to use
pm_runtime support which should clean up the clock code.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
 arch/arm/mach-omap2/clock44xx_data.c |    9 ++-------
 1 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
index 276992d..8c96567 100644
--- a/arch/arm/mach-omap2/clock44xx_data.c
+++ b/arch/arm/mach-omap2/clock44xx_data.c
@@ -3116,14 +3116,9 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"dsp_fck",			&dsp_fck,	CK_443X),
 	CLK("omapdss_dss",	"sys_clk",			&dss_sys_clk,	CK_443X),
 	CLK("omapdss_dss",	"tv_clk",			&dss_tv_clk,	CK_443X),
-	CLK("omapdss_dss",	"dss_clk",			&dss_dss_clk,	CK_443X),
 	CLK("omapdss_dss",	"video_clk",			&dss_48mhz_clk,	CK_443X),
-	CLK("omapdss_dss",	"fck",				&dss_fck,	CK_443X),
-	/*
-	 * On OMAP4, DSS ick is a dummy clock; this is needed for compatibility
-	 * with OMAP2/3.
-	 */
-	CLK("omapdss_dss",	"ick",				&dummy_ck,	CK_443X),
+	CLK("omapdss_dss",	"fck",				&dss_dss_clk,	CK_443X),
+	CLK("omapdss_dss",	"ick",				&dss_fck,	CK_443X),
 	CLK(NULL,	"efuse_ctrl_cust_fck",		&efuse_ctrl_cust_fck,	CK_443X),
 	CLK(NULL,	"emif1_fck",			&emif1_fck,	CK_443X),
 	CLK(NULL,	"emif2_fck",			&emif2_fck,	CK_443X),
-- 
1.7.1




^ permalink raw reply related	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-04  6:53           ` Tomi Valkeinen
@ 2011-04-06  9:09             ` Tomi Valkeinen
  2011-04-07 19:27             ` Paul Walmsley
  2011-04-08 16:50             ` Paul Walmsley
  2 siblings, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-06  9:09 UTC (permalink / raw)
  To: Paul Walmsley, Cousson, Benoit; +Cc: Semwal, Sumit, Taneja, Archit, linux-omap

Paul, Benoit,

On Mon, 2011-04-04 at 09:53 +0300, Tomi Valkeinen wrote:
> Hi Paul, Benoit,
> 
> On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
> 
> > Based on the E-mail thread so far, I'd say that changing the clock aliases 
> > is the way to go for right now.  The clock aliases are not hardware data; 
> > they just control how the clock hardware is mapped to the drivers.
> 
> I'd very much prefer this option. Below is a patch for this.
> 
> If Benoit doesn't complain too much about this, I'd like to get this
> merged as soon as possible, as OMAP4 DSS is currently crashing in the
> mainline kernel.
> 
> I can either handle it myself if I get your acks, or you can send a pull
> request for this if you have some other patches going in also.

Ping. Can I get an ack/nack from you for the patch below?

 Tomi

> > Of course, at some point soon, those clock aliases are going to go away.  
> > But hopefully you all will have converted the driver over to PM runtime at 
> > that point.
> > 
> > Once that happens, there's another problem: omap_hwmod_enable() is defined 
> > that the hardware registers should be accessible by the MPU after it 
> > completes.  So by that definition, the hwmod code should be 
> > enabling/disabling that dss_clk clock too when it enables/idles/shuts down 
> > the hwmod.  Probably we'd need to mark that struct omap_hwmod_opt_clk with 
> > some flag.  Then we'd need some kind of way for the DSS to tell the hwmod 
> > code whether it is or isn't reliant on the PRCM-provided functional clock 
> > for its internal functional clock.  Maybe something like 
> > omap_hwmod_{release,require}_system_fclk()?
> 
> Hmm, right. I guess no other HW module has clock setups like this?
> 
> Currently DSS can use clk_enable/disable() for the system fclk when its
> using DSI PLL for the fclk. So omap_hwmod_{release,require}_system_fclk
> sounds like a simple solution to this.
> 
> Not directly related, but something I've been wondering about is how to
> abstract the DSI/HDMI PLLs in DSS. What do you think, would it be
> possible/worth it to create struct clks for the clocks coming out of
> those PLLs? These would, of course, be DSS internal clks. I'm not very
> familiar with the clock framework, so I don't really have any idea what
> this would require and what would be the pros and cons.
> 
> ---
> 
> From f9999ceb48b2e22217dccc85b33362b6a17e5a00 Mon Sep 17 00:00:00 2001
> From: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Date: Mon, 4 Apr 2011 09:26:19 +0300
> Subject: [PATCH] OMAP4: clock data: Change DSS clock aliases
> 
> DSS driver has used fck and ick clocks on OMAP2/3 to get DSS HW up and
> running, and also to get the pixel clock's source clock rate from the
> fck.
> 
> On OMAP4 the clock data is set up in a different way, as there's no ick,
> dss_fck points to a fake clock which just affects DSS's MODULEMODE, and
> dss_dss_clk if the DSS_FCK.
> 
> From DSS driver's point of view the dss_fck sounds like an ick, and
> dss_dss_clk is the fck. While this is not entirely correct from HW point
> of view, especially for the ick, configuring the clock aliases that way
> makes DSS "just work" with OMAP4's clock setup.
> 
> In the (hopefully near) future DSS driver will be reworked to use
> pm_runtime support which should clean up the clock code.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> ---
>  arch/arm/mach-omap2/clock44xx_data.c |    9 ++-------
>  1 files changed, 2 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
> index 276992d..8c96567 100644
> --- a/arch/arm/mach-omap2/clock44xx_data.c
> +++ b/arch/arm/mach-omap2/clock44xx_data.c
> @@ -3116,14 +3116,9 @@ static struct omap_clk omap44xx_clks[] = {
>  	CLK(NULL,	"dsp_fck",			&dsp_fck,	CK_443X),
>  	CLK("omapdss_dss",	"sys_clk",			&dss_sys_clk,	CK_443X),
>  	CLK("omapdss_dss",	"tv_clk",			&dss_tv_clk,	CK_443X),
> -	CLK("omapdss_dss",	"dss_clk",			&dss_dss_clk,	CK_443X),
>  	CLK("omapdss_dss",	"video_clk",			&dss_48mhz_clk,	CK_443X),
> -	CLK("omapdss_dss",	"fck",				&dss_fck,	CK_443X),
> -	/*
> -	 * On OMAP4, DSS ick is a dummy clock; this is needed for compatibility
> -	 * with OMAP2/3.
> -	 */
> -	CLK("omapdss_dss",	"ick",				&dummy_ck,	CK_443X),
> +	CLK("omapdss_dss",	"fck",				&dss_dss_clk,	CK_443X),
> +	CLK("omapdss_dss",	"ick",				&dss_fck,	CK_443X),
>  	CLK(NULL,	"efuse_ctrl_cust_fck",		&efuse_ctrl_cust_fck,	CK_443X),
>  	CLK(NULL,	"emif1_fck",			&emif1_fck,	CK_443X),
>  	CLK(NULL,	"emif2_fck",			&emif2_fck,	CK_443X),



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-04  6:53           ` Tomi Valkeinen
  2011-04-06  9:09             ` Tomi Valkeinen
@ 2011-04-07 19:27             ` Paul Walmsley
  2011-04-08  5:51               ` Tomi Valkeinen
  2011-04-08 14:23               ` Cousson, Benoit
  2011-04-08 16:50             ` Paul Walmsley
  2 siblings, 2 replies; 29+ messages in thread
From: Paul Walmsley @ 2011-04-07 19:27 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2767 bytes --]

Hello Tomi, Benoît,

On Mon, 4 Apr 2011, Tomi Valkeinen wrote:

> On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
> 
> > Based on the E-mail thread so far, I'd say that changing the clock aliases 
> > is the way to go for right now.  The clock aliases are not hardware data; 
> > they just control how the clock hardware is mapped to the drivers.
> 
> I'd very much prefer this option. Below is a patch for this.
> 
> If Benoit doesn't complain too much about this, I'd like to get this
> merged as soon as possible, as OMAP4 DSS is currently crashing in the
> mainline kernel.

I will queue your clock aliases patch and attempt to merge it upstream for 
the -rc series.  I am not happy to be disagreeing with Benoît here, but 
this is the rationale that I am using.  (Benoît, Tomi, please feel free to 
correct if there is something blatantly false below.)

1. The integration of the DSS module is an unusual case.  The
   MODULEMODE bits for the DSS bits do not control the DSS "main"
   functional clock (the clock that is needed to access device
   registers); instead, they only control the DSS interface clock.
   (This is because the DSS can use a functional clock that is not
   provided by the OMAP core.)  So calling the DSS MODULEMODE struct
   clk "dss_fck" is not really correct, since it is really controlling
   the interface clock.

2. This patch does not create a precedent for hacking around general
   driver clocking problems in the clock or clock data.  This is only
   needed because the MODULEMODE bits don't control the module
   functional clock in this case.  As I understand it, the only other
   device that this problem could occur with is McBSP, due to
   mcbsp_clks.

3. The existing DSS2 driver clock design apparently works fine when
   this change is implemented[1], so no driver changes will be needed.

4. The proposed DSS driver patch to work around this uses a nasty hack
   that really should be NACK'ed[2].

All this said, we may not be able to merge this change upstream, due to 
the recent unhappiness about the clock data changes.  If Linus rejects it, 
you'll need a "Plan B."

...

Also, I hope you and the other DSS hackers can finish the PM runtime
conversion of the DSS driver soon.  Ideally before any new DSS
features are added.  We really need to be able to separate the OMAP
integration details from the drivers, and right now, hwmod and PM
runtime are the best way we have to do that.

Comments welcome.


- Paul


1. Valkeinen, Tomi.  _Re: OMAP4 DSS clock setup_.  E-mail to 
linux-omap@vger.kernel.org mailing list dated Wed, 30 Mar 2011 05:59:06 
-0700. 
<http://www.mail-archive.com/linux-omap@vger.kernel.org/msg47665.html>

2. ibid.

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-07 19:27             ` Paul Walmsley
@ 2011-04-08  5:51               ` Tomi Valkeinen
  2011-04-08 14:55                 ` Paul Walmsley
                                   ` (2 more replies)
  2011-04-08 14:23               ` Cousson, Benoit
  1 sibling, 3 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-08  5:51 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Paul,

On Thu, 2011-04-07 at 13:27 -0600, Paul Walmsley wrote:
> Hello Tomi, Benoît,
> 
> On Mon, 4 Apr 2011, Tomi Valkeinen wrote:
> 
> > On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
> > 
> > > Based on the E-mail thread so far, I'd say that changing the clock aliases 
> > > is the way to go for right now.  The clock aliases are not hardware data; 
> > > they just control how the clock hardware is mapped to the drivers.
> > 
> > I'd very much prefer this option. Below is a patch for this.
> > 
> > If Benoit doesn't complain too much about this, I'd like to get this
> > merged as soon as possible, as OMAP4 DSS is currently crashing in the
> > mainline kernel.
> 
> I will queue your clock aliases patch and attempt to merge it upstream for 
> the -rc series.  I am not happy to be disagreeing with Benoît here, but 
> this is the rationale that I am using.  (Benoît, Tomi, please feel free to 
> correct if there is something blatantly false below.)
> 
> 1. The integration of the DSS module is an unusual case.  The
>    MODULEMODE bits for the DSS bits do not control the DSS "main"
>    functional clock (the clock that is needed to access device
>    registers); instead, they only control the DSS interface clock.
>    (This is because the DSS can use a functional clock that is not
>    provided by the OMAP core.)  So calling the DSS MODULEMODE struct
>    clk "dss_fck" is not really correct, since it is really controlling
>    the interface clock.

If we don't apply the patch, I think the clock aliases are still broken.
Let's forget the ick/fck thing for a second, and just think the clock
from PRCM which is used as the source clock for pixel clock. That is
currently called "fck" on OMAP2/3, but "dss_dss_clk" on OMAP4. This
cannot be right, can it? From DSS's point of view that is the same
clock, it should clearly have the same alias on all platforms. I don't
care what the name is as long as it's consistent on all platforms.

And I have to say I still don't quite get it what is the problem with
"fck" name. Or is that meant to be a clock which enables the registers
on the module, and not the clock used for the pixel clock? If so, I'm
fine with having "fck" to be what it is currently, but then we need a
new name for the clock used for pixel clock, which is consistent on all
platforms.

> 2. This patch does not create a precedent for hacking around general
>    driver clocking problems in the clock or clock data.  This is only
>    needed because the MODULEMODE bits don't control the module
>    functional clock in this case.  As I understand it, the only other
>    device that this problem could occur with is McBSP, due to
>    mcbsp_clks.
> 
> 3. The existing DSS2 driver clock design apparently works fine when
>    this change is implemented[1], so no driver changes will be needed.
> 
> 4. The proposed DSS driver patch to work around this uses a nasty hack
>    that really should be NACK'ed[2].
> 
> All this said, we may not be able to merge this change upstream, due to 
> the recent unhappiness about the clock data changes.  If Linus rejects it, 
> you'll need a "Plan B."
> 
> ...
> 
> Also, I hope you and the other DSS hackers can finish the PM runtime
> conversion of the DSS driver soon.  Ideally before any new DSS
> features are added.  We really need to be able to separate the OMAP
> integration details from the drivers, and right now, hwmod and PM
> runtime are the best way we have to do that.

I also started to look at the PM runtime, but it doesn't fix the issue
with the inconsistent clock name I described above.

I also have some questions regarding PM runtime, perhaps I'll just put
them here as they are slightly related:

- Should every DSS module handle their clocks independently, i.e. should
VENC get its own clocks and DSI should get its own? If so, we need a
bunch of new clock aliases so the devices can get their clocks.

- Should every DSS module have their own PM runtime handling? (actually
related to the question above)

- If the modules are handled separately, how should the dependencies be
handled? For example, dss_core's reset will reset all the other modules
also, and most of the submodules need functions from dss_core and
dss_dispc. So should, say, dss_dsi then call functions in core and dispc
to "get" them, i.e. increase their pm runtime use count?

- There seems to be some child/parent relationships in PM runtime.
Should dss_core be the parent for the rest of the DSS modules? This
would at least solve the reset issue easily, I guess.

- How does saving/restoring the registers for OFF mode go with PM
runtime? Should the registers be saved in runtime_suspend(), and
restored in runtime_resume()? Can/should
omap_pm_get_dev_context_loss_count() still be used to optimize the
restoring?

 Tomi


--
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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-07 19:27             ` Paul Walmsley
  2011-04-08  5:51               ` Tomi Valkeinen
@ 2011-04-08 14:23               ` Cousson, Benoit
  1 sibling, 0 replies; 29+ messages in thread
From: Cousson, Benoit @ 2011-04-08 14:23 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Valkeinen, Tomi, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Paul,

On 4/7/2011 9:27 PM, Paul Walmsley wrote:
> Hello Tomi, Benoît,
>
> On Mon, 4 Apr 2011, Tomi Valkeinen wrote:
>
>> On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
>>
>>> Based on the E-mail thread so far, I'd say that changing the clock aliases
>>> is the way to go for right now.  The clock aliases are not hardware data;
>>> they just control how the clock hardware is mapped to the drivers.
>>
>> I'd very much prefer this option. Below is a patch for this.
>>
>> If Benoit doesn't complain too much about this, I'd like to get this
>> merged as soon as possible, as OMAP4 DSS is currently crashing in the
>> mainline kernel.
>
> I will queue your clock aliases patch and attempt to merge it upstream for
> the -rc series.  I am not happy to be disagreeing with Benoît here, but
> this is the rationale that I am using.  (Benoît, Tomi, please feel free to
> correct if there is something blatantly false below.)

That's quite good that you were disagreeing with me, because I think 
that you are indeed right:-)

> 1. The integration of the DSS module is an unusual case.  The
>     MODULEMODE bits for the DSS bits do not control the DSS "main"
>     functional clock (the clock that is needed to access device
>     registers); instead, they only control the DSS interface clock.
>     (This is because the DSS can use a functional clock that is not
>     provided by the OMAP core.)  So calling the DSS MODULEMODE struct
>     clk "dss_fck" is not really correct, since it is really controlling
>     the interface clock.

I've just got the confirmation from a PRCM designer that this is indeed 
what is happening.

In the case of the DSS the optional functional clocks are provided by 
the PRCM and thus managed by the PRCM. The only difference is that since 
two different functional clocks are available, the PRCM cannot chose 
automatically the proper one.
Hence the term optional fck, meaning that the SW has to explicitly 
enable them. The PRCM will not do it when modulemode will be enabled.

So in that case enabling the modulemode will effectively enable the 
module for the PRCM point of view and just request the iclk if not 
already available.

The only point that we need to take care of is the sequence.
The PRCM spec clearly specify that one of the optional clock must be 
active before the modulemode is enabled.
That does not seems to be the case in the current DSS code.

> 2. This patch does not create a precedent for hacking around general
>     driver clocking problems in the clock or clock data.  This is only
>     needed because the MODULEMODE bits don't control the module
>     functional clock in this case.  As I understand it, the only other
>     device that this problem could occur with is McBSP, due to
>     mcbsp_clks.

In that case this is slightly different because even the PRCM does not 
control these external clocks. Whereas in the case of the dss_fck, if 
the DPLL is not locked when you request it, it will be enabled 
automatically. Assuming that auto mode are enabled.

> 3. The existing DSS2 driver clock design apparently works fine when
>     this change is implemented[1], so no driver changes will be needed.

Yeah, but my point was that driver changes will be needed anyway, hence 
my preference to hack the driver instead of hacking the clock data.

> 4. The proposed DSS driver patch to work around this uses a nasty hack
>     that really should be NACK'ed[2].
>
> All this said, we may not be able to merge this change upstream, due to
> the recent unhappiness about the clock data changes.  If Linus rejects it,
> you'll need a "Plan B."

That's was my #2 concern as well.

See you soon at ELC.

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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08  5:51               ` Tomi Valkeinen
@ 2011-04-08 14:55                 ` Paul Walmsley
  2011-04-11  9:05                   ` Tomi Valkeinen
  2011-04-08 15:36                 ` Cousson, Benoit
  2011-04-08 16:28                 ` Paul Walmsley
  2 siblings, 1 reply; 29+ messages in thread
From: Paul Walmsley @ 2011-04-08 14:55 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: TEXT/PLAIN, Size: 3389 bytes --]

Hi

On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
> On Thu, 2011-04-07 at 13:27 -0600, Paul Walmsley wrote:
> > On Mon, 4 Apr 2011, Tomi Valkeinen wrote:
> > 
> > > On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
> > > 
> > > > Based on the E-mail thread so far, I'd say that changing the clock aliases 
> > > > is the way to go for right now.  The clock aliases are not hardware data; 
> > > > they just control how the clock hardware is mapped to the drivers.
> > > 
> > > I'd very much prefer this option. Below is a patch for this.
> > > 
> > > If Benoit doesn't complain too much about this, I'd like to get this
> > > merged as soon as possible, as OMAP4 DSS is currently crashing in the
> > > mainline kernel.
> > 
> > I will queue your clock aliases patch and attempt to merge it upstream for 
> > the -rc series.  I am not happy to be disagreeing with Benoît here, but 
> > this is the rationale that I am using.  (Benoît, Tomi, please feel free to 
> > correct if there is something blatantly false below.)
> > 
> > 1. The integration of the DSS module is an unusual case.  The
> >    MODULEMODE bits for the DSS bits do not control the DSS "main"
> >    functional clock (the clock that is needed to access device
> >    registers); instead, they only control the DSS interface clock.
> >    (This is because the DSS can use a functional clock that is not
> >    provided by the OMAP core.)  So calling the DSS MODULEMODE struct
> >    clk "dss_fck" is not really correct, since it is really controlling
> >    the interface clock.
> 
> If we don't apply the patch, I think the clock aliases are still broken.
> Let's forget the ick/fck thing for a second, and just think the clock
> from PRCM which is used as the source clock for pixel clock. That is
> currently called "fck" on OMAP2/3, but "dss_dss_clk" on OMAP4. This
> cannot be right, can it? From DSS's point of view that is the same
> clock, it should clearly have the same alias on all platforms. I don't
> care what the name is as long as it's consistent on all platforms.

Yes, I agree.  That is another good point.

> And I have to say I still don't quite get it what is the problem with
> "fck" name.

After the hwmod/PM runtime conversion, there shouldn't be any clock 
aliases left that are simply called "fck", because it is almost a 
meaningless name.

> Or is that meant to be a clock which enables the registers
> on the module,

After the hwmod/PM runtime conversion, that should have an alias name of 
"main" that is automatically added by the omap_device code.  (Note that it 
does not appear to do so now; that is a bug that needs be fixed.)

> and not the clock used for the pixel clock? If so, I'm fine with having 
> "fck" to be what it is currently, but then we need a new name for the 
> clock used for pixel clock, which is consistent on all platforms.

If there is a separate PRCM-provided clock used only for the pixel clock, 
then that clock should have an alias name of "system_pixel_ck" or 
something similar that is meaningful to the DSS driver.  I think the 
problem in this case is that "dss_dss_clk" is (optionally) used for two 
purposes: optionally as a "main PRCM-provided functional clock" and 
optionally as a system-provided pixel clock.

I'll reply to the rest of your mail in a separate E-mail...


- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08  5:51               ` Tomi Valkeinen
  2011-04-08 14:55                 ` Paul Walmsley
@ 2011-04-08 15:36                 ` Cousson, Benoit
  2011-04-08 16:35                   ` Tomi Valkeinen
  2011-04-08 16:28                 ` Paul Walmsley
  2 siblings, 1 reply; 29+ messages in thread
From: Cousson, Benoit @ 2011-04-08 15:36 UTC (permalink / raw)
  To: Valkeinen, Tomi; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Tomi,

On 4/8/2011 7:51 AM, Valkeinen, Tomi wrote:
> Hi Paul,
> 
> On Thu, 2011-04-07 at 13:27 -0600, Paul Walmsley wrote:
>> Hello Tomi, Benoît,
>>
>> On Mon, 4 Apr 2011, Tomi Valkeinen wrote:
>>
>>> On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
>>>
>>>> Based on the E-mail thread so far, I'd say that changing the clock aliases
>>>> is the way to go for right now.  The clock aliases are not hardware data;
>>>> they just control how the clock hardware is mapped to the drivers.
>>>
>>> I'd very much prefer this option. Below is a patch for this.
>>>
>>> If Benoit doesn't complain too much about this, I'd like to get this
>>> merged as soon as possible, as OMAP4 DSS is currently crashing in the
>>> mainline kernel.
>>
>> I will queue your clock aliases patch and attempt to merge it upstream for
>> the -rc series.  I am not happy to be disagreeing with Benoît here, but
>> this is the rationale that I am using.  (Benoît, Tomi, please feel free to
>> correct if there is something blatantly false below.)
>>
>> 1. The integration of the DSS module is an unusual case.  The
>>     MODULEMODE bits for the DSS bits do not control the DSS "main"
>>     functional clock (the clock that is needed to access device
>>     registers); instead, they only control the DSS interface clock.
>>     (This is because the DSS can use a functional clock that is not
>>     provided by the OMAP core.)  So calling the DSS MODULEMODE struct
>>     clk "dss_fck" is not really correct, since it is really controlling
>>     the interface clock.
> 
> If we don't apply the patch, I think the clock aliases are still broken.
> Let's forget the ick/fck thing for a second, and just think the clock
> from PRCM which is used as the source clock for pixel clock. That is
> currently called "fck" on OMAP2/3, but "dss_dss_clk" on OMAP4. This
> cannot be right, can it? From DSS's point of view that is the same
> clock, it should clearly have the same alias on all platforms. I don't
> care what the name is as long as it's consistent on all platforms.
> 
> And I have to say I still don't quite get it what is the problem with
> "fck" name. Or is that meant to be a clock which enables the registers
> on the module, and not the clock used for the pixel clock? If so, I'm
> fine with having "fck" to be what it is currently, but then we need a
> new name for the clock used for pixel clock, which is consistent on all
> platforms.

Both can be used for the system clock (sys_clk -> DSI DPLL or dss_dss_clk).

In fact after multiple discussions with DSS and PRCM folks, I realized that OMAP3 and 4 are using exactly the same clock scheme :-(

The confusion in my mind came from change in naming convention in both the PRCM and the DSS at the same time between OMAP3 and 4.

OMAP3          -> OMAP4
dss1_alwon_fck -> dss_dss_clk (from dpll per output in both cases)
dss2_alwon_fck -> dss_sys_clk
dss_ick        -> dss_fck (-> modulemode) that name really needs to be changed to avoid further confusion.


So in fact the OMAP4 aliased should be: 
CLK("omapdss_dss",	"fck",		&dss_dss_clk,	CK_443X),
CLK("omapdss_dss",	"sys_clk",	&dss_sys_clk,	CK_443X),
CLK("omapdss_dss",	"ick",		&dss_fck,	CK_443X),


That will map perfectly what we have on OMAP3:
CLK("omapdss_dss",	"fck",		&dss1_alwon_fck_3430es2, ...),
CLK("omapdss_dss",	"sys_clk",	&dss2_alwon_fck, ...),
CLK("omapdss_dss",	"ick",		&dss_ick_3430es2, ...),


>> 2. This patch does not create a precedent for hacking around general
>>     driver clocking problems in the clock or clock data.  This is only
>>     needed because the MODULEMODE bits don't control the module
>>     functional clock in this case.  As I understand it, the only other
>>     device that this problem could occur with is McBSP, due to
>>     mcbsp_clks.
>>
>> 3. The existing DSS2 driver clock design apparently works fine when
>>     this change is implemented[1], so no driver changes will be needed.
>>
>> 4. The proposed DSS driver patch to work around this uses a nasty hack
>>     that really should be NACK'ed[2].
>>
>> All this said, we may not be able to merge this change upstream, due to
>> the recent unhappiness about the clock data changes.  If Linus rejects it,
>> you'll need a "Plan B."
>>
>> ...
>>
>> Also, I hope you and the other DSS hackers can finish the PM runtime
>> conversion of the DSS driver soon.  Ideally before any new DSS
>> features are added.  We really need to be able to separate the OMAP
>> integration details from the drivers, and right now, hwmod and PM
>> runtime are the best way we have to do that.
> 
> I also started to look at the PM runtime, but it doesn't fix the issue
> with the inconsistent clock name I described above.

No indeed.

> I also have some questions regarding PM runtime, perhaps I'll just put
> them here as they are slightly related:
> 
> - Should every DSS module handle their clocks independently, i.e. should
> VENC get its own clocks and DSI should get its own? If so, we need a
> bunch of new clock aliases so the devices can get their clocks.

For dedicated clock like tv_clk, it probably makes sense, because the other DSS drivers do not have to care about that clock.

> - Should every DSS module have their own PM runtime handling? (actually
> related to the question above)
> 
> - If the modules are handled separately, how should the dependencies be
> handled? For example, dss_core's reset will reset all the other modules
> also, and most of the submodules need functions from dss_core and
> dss_dispc. So should, say, dss_dsi then call functions in core and dispc
> to "get" them, i.e. increase their pm runtime use count?

Are you sure about that? 
The dss_core does not have any reset in the sysonfig (only a status), but the dispc does have one and the dsi as well.
That being said, the dss modules have some issue with the softreset at boot time, so I'm not sure what these bits are really doing.

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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08  5:51               ` Tomi Valkeinen
  2011-04-08 14:55                 ` Paul Walmsley
  2011-04-08 15:36                 ` Cousson, Benoit
@ 2011-04-08 16:28                 ` Paul Walmsley
  2011-04-11  8:56                   ` Tomi Valkeinen
  2 siblings, 1 reply; 29+ messages in thread
From: Paul Walmsley @ 2011-04-08 16:28 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: TEXT/PLAIN, Size: 6574 bytes --]

Hi Tomi,

On Fri, 8 Apr 2011, Tomi Valkeinen wrote:

> > Also, I hope you and the other DSS hackers can finish the PM runtime
> > conversion of the DSS driver soon.  Ideally before any new DSS
> > features are added.  We really need to be able to separate the OMAP
> > integration details from the drivers, and right now, hwmod and PM
> > runtime are the best way we have to do that.
> 
> I also started to look at the PM runtime, but it doesn't fix the issue
> with the inconsistent clock name I described above.

After the hwmod/PM runtime conversion, I don't think any of the clock 
aliases currently in clock*_data.c should be used by the DSS driver (or by 
anything else on the system, for that matter).  That's because the 
omap_device code should set up the "main" alias for the DSS main 
functional clock[*], as well as the aliases in the optional clock data in 
the OMAP hwmod data files:

static struct omap_hwmod_opt_clk dss_opt_clks[] = {
	{ .role = "sys_clk", .clk = "dss_sys_clk" },
	{ .role = "tv_clk", .clk = "dss_tv_clk" },
	{ .role = "dss_clk", .clk = "dss_dss_clk" },
	{ .role = "video_clk", .clk = "dss_48mhz_clk" },
};

It might be that some of these role names aren't quite accurate and need 
to be changed.  Those are intended to be meaningful to the driver, so 
comments there are definitely welcome.

[*]. The "main" alias should be defined by the omap_device code 
automatically, similarly to how _add_optional_clock_clkdev() does it.  It 
does not do so currently.  This needs to be fixed in the omap_device.c 
code.

> I also have some questions regarding PM runtime, perhaps I'll just put
> them here as they are slightly related:
> 
> - Should every DSS module handle their clocks independently, i.e. should
> VENC get its own clocks and DSI should get its own? If so, we need a
> bunch of new clock aliases so the devices can get their clocks.

If all that driver code needs to do is to enable its main functional clock 
when it is active and disable that clock when the driver is inactive, 
then, no, the drivers shouldn't need their own clock aliases.  Same if the 
driver only needs to get the rate or set the rate on that main functional 
clock, since that alias should be set up automatically.

But if the driver for that submodule needs to control PRCM-provided 
optional clocks, then it will need to have struct omap_hwmod_opt_clk 
entries defined in the hwmod data.

> - Should every DSS module have their own PM runtime handling? (actually
> related to the question above)

Yes, I think so.  From the integration perspective, we are trying to get 
to the point where each omap_device maps to only one hwmod.

> - If the modules are handled separately, how should the dependencies be 
> handled? For example, dss_core's reset will reset all the other modules 
> also, and most of the submodules need functions from dss_core and 
> dss_dispc. So should, say, dss_dsi then call functions in core and dispc 
> to "get" them, i.e. increase their pm runtime use count?

Probably not.

Here is how I would suggest structuring the code.  This is only a naïve 
suggestion; you and your team almost certainly know better than I.

I'd suggest that you separate low-level register access into .c files 
that are targeted specifically for the IP block.  So in the DSS case, 
you'd have dss.c, dispc.c, dsi.c, hdmi.c, rfbi.c, venc.c.  Each one should 
be a separate platform_device and would export symbols.  Hopefully, there 
should be no cross-dependencies between these low-level files.

Then you'd have "higher-level" code that might need to read/write from 
multiple DSS submodules to complete some higher-level operation.  That 
would be at least one separate driver -- say, "dss2" or something -- with 
dependencies on the low-level drivers.  So, for example, when that 
higher-level driver is modprobe'd, Linux would also load the drivers for 
the underlying hardware blocks that it uses.

> - There seems to be some child/parent relationships in PM runtime.
> Should dss_core be the parent for the rest of the DSS modules? This
> would at least solve the reset issue easily, I guess.

Yes, I think that's more accurate, anyway.  Something isn't right with the 
DSS hwmod data.  According to the OMAP4 Public TRM Rev O Table 10-3 "DSS 
Integration," there's a Sonics LX bus lurking in there.  All of the DSS 
submodules should have slave sockets with that Sonics LX bus as their 
master.  And the hwmod associated with the SLX should have an address 
range that covers all of the DSS submodules.  I assume that the logical 
hwmod to associate the SLX with is "dss_core", as you write.

Also, I notice the "CAUTION" boxes in Section 10.1.3 "DSS Register 
Manual", 10.2.7 "Display Controller Register Manual", etc. etc., that say 
that the DSS and submodules should be accessed through the L3 address 
space.  But all of the DSS hwmod register targets are listed as the L4_PER 
variants.  So the hwmod data also doesn't appear to be correct there.  The 
correct approach would be to have both address spaces listed in struct 
omap_hwmod_addr_space arrays, but to mark only the struct 
omap_hwmod_ocp_if entry associated with the L3 bus as OCP_USER_MPU | 
OCP_USER_SDMA[*].

[*]. On the OMAP core code, looks like we'll also want to modify 
omap_hwmod_build_resources() to mark resources with IORESOURCE_DISABLED if 
they are not marked with any OCP_USER_* flags, and patch the functions in 
drivers/base/platform.c to skip any resources with IORESOURCE_DISABLED 
set.

> - How does saving/restoring the registers for OFF mode go with PM
> runtime? Should the registers be saved in runtime_suspend(), and
> restored in runtime_resume()?

If you don't use shadow registers, then I think so, yes, although Kevin 
might know better than I.

> Can/should omap_pm_get_dev_context_loss_count() still be used to 
> optimize the restoring?

Yes.

...

I regret that this process is relatively complicated :-(  As you and/or 
your team works on this, changes to the hwmod/omap_device/clock core will 
almost certainly be needed.  Please don't hesitate to let us know what's 
not working for you, or to try out patches to the core infrastructure to 
fix what you need.  If I don't respond, please just keep pinging.  I 
wasn't able to fully analyze the DSS module when we originally wrote the 
hwmod code, so surely we'll need to fix some bugs or make some changes for 
things to make sense.

best regards,


- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08 15:36                 ` Cousson, Benoit
@ 2011-04-08 16:35                   ` Tomi Valkeinen
  0 siblings, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-08 16:35 UTC (permalink / raw)
  To: Cousson, Benoit; +Cc: Paul Walmsley, Semwal, Sumit, Taneja, Archit, linux-omap

On Fri, 2011-04-08 at 17:36 +0200, Cousson, Benoit wrote:
> Hi Tomi,
> 
> On 4/8/2011 7:51 AM, Valkeinen, Tomi wrote:

> > - If the modules are handled separately, how should the dependencies be
> > handled? For example, dss_core's reset will reset all the other modules
> > also, and most of the submodules need functions from dss_core and
> > dss_dispc. So should, say, dss_dsi then call functions in core and dispc
> > to "get" them, i.e. increase their pm runtime use count?
> 
> Are you sure about that? 
> The dss_core does not have any reset in the sysonfig (only a status), but the dispc does have one and the dsi as well.

Ah, I might be speaking only of OMAP2/3. I remember somebody saying that
the DSS reset bit on OMAP4 is marked as reserved. But for OMAP3 (and I
think for OMAP2 also) the DSS_SYSCONFIG reset bit will reset also the
rest of the DSS.

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-04  6:53           ` Tomi Valkeinen
  2011-04-06  9:09             ` Tomi Valkeinen
  2011-04-07 19:27             ` Paul Walmsley
@ 2011-04-08 16:50             ` Paul Walmsley
  2011-04-11  9:09               ` Tomi Valkeinen
  2 siblings, 1 reply; 29+ messages in thread
From: Paul Walmsley @ 2011-04-08 16:50 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

Hi Tomi,

On Mon, 4 Apr 2011, Tomi Valkeinen wrote:

> On Fri, 2011-04-01 at 20:12 -0600, Paul Walmsley wrote:
> 
> > Of course, at some point soon, those clock aliases are going to go away.  
> > But hopefully you all will have converted the driver over to PM runtime at 
> > that point.
> > 
> > Once that happens, there's another problem: omap_hwmod_enable() is defined 
> > that the hardware registers should be accessible by the MPU after it 
> > completes.  So by that definition, the hwmod code should be 
> > enabling/disabling that dss_clk clock too when it enables/idles/shuts down 
> > the hwmod.  Probably we'd need to mark that struct omap_hwmod_opt_clk with 
> > some flag.  Then we'd need some kind of way for the DSS to tell the hwmod 
> > code whether it is or isn't reliant on the PRCM-provided functional clock 
> > for its internal functional clock.  Maybe something like 
> > omap_hwmod_{release,require}_system_fclk()?
> 
> Hmm, right. I guess no other HW module has clock setups like this?

I think McBSP can have an optional main functional clock.  So something 
like that should be usable for that case too. (In the McBSP case, the 
optional clock isn't controlled by the PRCM, it's controlled by the SCM, 
but that doesn't really matter to the hwmod code.)

> Currently DSS can use clk_enable/disable() for the system fclk when its
> using DSI PLL for the fclk. So omap_hwmod_{release,require}_system_fclk
> sounds like a simple solution to this.

OK.  The only problem with those functions (actually 
omap_device_{release,require}_system_fclk()) is that they will need to be 
called through platform_data function pointers for now.  Maybe it is 
possible to handle something like this simply with the clock framework 
also.

> Not directly related, but something I've been wondering about is how to
> abstract the DSI/HDMI PLLs in DSS. What do you think, would it be
> possible/worth it to create struct clks for the clocks coming out of
> those PLLs? These would, of course, be DSS internal clks. I'm not very
> familiar with the clock framework, so I don't really have any idea what
> this would require and what would be the pros and cons.

Yes, I think it would be good to try to implement the entire DSS clock 
tree in the clock framework.  One change to the clock code that we know 
we'll need is to put a hwmod pointer in the struct clk which tells the 
clock code that the hwmod needs to be enabled in order to access the 
clock's registers.  Right now, the clock code assumes that all of the 
clock registers are accessible, all of the time.


- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08 16:28                 ` Paul Walmsley
@ 2011-04-11  8:56                   ` Tomi Valkeinen
  2011-04-11 16:05                     ` Paul Walmsley
  0 siblings, 1 reply; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-11  8:56 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

On Fri, 2011-04-08 at 10:28 -0600, Paul Walmsley wrote:
> Hi Tomi,
> 
> On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
> 
> > > Also, I hope you and the other DSS hackers can finish the PM runtime
> > > conversion of the DSS driver soon.  Ideally before any new DSS
> > > features are added.  We really need to be able to separate the OMAP
> > > integration details from the drivers, and right now, hwmod and PM
> > > runtime are the best way we have to do that.
> > 
> > I also started to look at the PM runtime, but it doesn't fix the issue
> > with the inconsistent clock name I described above.
> 
> After the hwmod/PM runtime conversion, I don't think any of the clock 
> aliases currently in clock*_data.c should be used by the DSS driver (or by 
> anything else on the system, for that matter).  That's because the 
> omap_device code should set up the "main" alias for the DSS main 

When should "main" clock be used by the driver? Or never, and pm_runtime
handles that?

> functional clock[*], as well as the aliases in the optional clock data in 
> the OMAP hwmod data files:
> 
> static struct omap_hwmod_opt_clk dss_opt_clks[] = {
> 	{ .role = "sys_clk", .clk = "dss_sys_clk" },
> 	{ .role = "tv_clk", .clk = "dss_tv_clk" },
> 	{ .role = "dss_clk", .clk = "dss_dss_clk" },
> 	{ .role = "video_clk", .clk = "dss_48mhz_clk" },
> };
> 
> It might be that some of these role names aren't quite accurate and need 
> to be changed.  Those are intended to be meaningful to the driver, so 
> comments there are definitely welcome.

How about OMAP3? It also has an optional functional clock, but that
doesn't seem to be set in dss_opt_clocks in omap_hwmod_3xxx_data.c.
Should it be there?

It seems dss1_alwon_fclk is currently the main clock for OMAP3 dss
hwmods. Does that mean it can never be turned off if DSS is in use?

> [*]. The "main" alias should be defined by the omap_device code 
> automatically, similarly to how _add_optional_clock_clkdev() does it.  It 
> does not do so currently.  This needs to be fixed in the omap_device.c 
> code.
> 
> > I also have some questions regarding PM runtime, perhaps I'll just put
> > them here as they are slightly related:
> > 
> > - Should every DSS module handle their clocks independently, i.e. should
> > VENC get its own clocks and DSI should get its own? If so, we need a
> > bunch of new clock aliases so the devices can get their clocks.
> 
> If all that driver code needs to do is to enable its main functional clock 
> when it is active and disable that clock when the driver is inactive, 
> then, no, the drivers shouldn't need their own clock aliases.  Same if the 
> driver only needs to get the rate or set the rate on that main functional 
> clock, since that alias should be set up automatically.
> 
> But if the driver for that submodule needs to control PRCM-provided 
> optional clocks, then it will need to have struct omap_hwmod_opt_clk 
> entries defined in the hwmod data.

Ok. Then we need omap_hwmod_opt_clk for at least for VENC and HDMI, I
believe.

> > - Should every DSS module have their own PM runtime handling? (actually
> > related to the question above)
> 
> Yes, I think so.  From the integration perspective, we are trying to get 
> to the point where each omap_device maps to only one hwmod.
> 
> > - If the modules are handled separately, how should the dependencies be 
> > handled? For example, dss_core's reset will reset all the other modules 
> > also, and most of the submodules need functions from dss_core and 
> > dss_dispc. So should, say, dss_dsi then call functions in core and dispc 
> > to "get" them, i.e. increase their pm runtime use count?
> 
> Probably not.
> 
> Here is how I would suggest structuring the code.  This is only a naïve 
> suggestion; you and your team almost certainly know better than I.
> 
> I'd suggest that you separate low-level register access into .c files 
> that are targeted specifically for the IP block.  So in the DSS case, 
> you'd have dss.c, dispc.c, dsi.c, hdmi.c, rfbi.c, venc.c.  Each one should 
> be a separate platform_device and would export symbols.  Hopefully, there 
> should be no cross-dependencies between these low-level files.
> 
> Then you'd have "higher-level" code that might need to read/write from 
> multiple DSS submodules to complete some higher-level operation.  That 
> would be at least one separate driver -- say, "dss2" or something -- with 
> dependencies on the low-level drivers.  So, for example, when that 
> higher-level driver is modprobe'd, Linux would also load the drivers for 
> the underlying hardware blocks that it uses.

But this still leaves my question open: If this "dss2" needs to use,
say, dispc.c and dsi.c, those low level drivers need to be enabled. So I
guess we would have something like dispc_get() or dispc_enable(), which
dss2 would call first. Those functions would then use pm_runtime to
enable the HW module. And the higher level driver would keep the low
level devices enabled while its doing something.

I have been thinking something like this also earlier. It would separate
things cleanly. One thing I don't like about it is the big amount of low
level DSS internal functions that need to be exported.

> > - There seems to be some child/parent relationships in PM runtime.
> > Should dss_core be the parent for the rest of the DSS modules? This
> > would at least solve the reset issue easily, I guess.
> 
> Yes, I think that's more accurate, anyway.  Something isn't right with the 

How are the child/parent relationships done for omap_devices? Does it
come somehow from the hwmod data? 

> DSS hwmod data.  According to the OMAP4 Public TRM Rev O Table 10-3 "DSS 
> Integration," there's a Sonics LX bus lurking in there.  All of the DSS 
> submodules should have slave sockets with that Sonics LX bus as their 
> master.  And the hwmod associated with the SLX should have an address 
> range that covers all of the DSS submodules.  I assume that the logical 
> hwmod to associate the SLX with is "dss_core", as you write.
> 
> Also, I notice the "CAUTION" boxes in Section 10.1.3 "DSS Register 
> Manual", 10.2.7 "Display Controller Register Manual", etc. etc., that say 
> that the DSS and submodules should be accessed through the L3 address 
> space.  But all of the DSS hwmod register targets are listed as the L4_PER 
> variants.  So the hwmod data also doesn't appear to be correct there.  The 
> correct approach would be to have both address spaces listed in struct 
> omap_hwmod_addr_space arrays, but to mark only the struct 
> omap_hwmod_ocp_if entry associated with the L3 bus as OCP_USER_MPU | 
> OCP_USER_SDMA[*].

As far as I'm concerned, L4 interface can be removed totally. TRM says
"The access through the L4_PER interconnect is provided for back
software compatibility.".

 Tomi


--
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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08 14:55                 ` Paul Walmsley
@ 2011-04-11  9:05                   ` Tomi Valkeinen
  2011-04-11 18:20                     ` Paul Walmsley
  0 siblings, 1 reply; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-11  9:05 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

On Fri, 2011-04-08 at 08:55 -0600, Paul Walmsley wrote:
> Hi
> 
> On Fri, 8 Apr 2011, Tomi Valkeinen wrote:

> > and not the clock used for the pixel clock? If so, I'm fine with having 
> > "fck" to be what it is currently, but then we need a new name for the 
> > clock used for pixel clock, which is consistent on all platforms.
> 
> If there is a separate PRCM-provided clock used only for the pixel clock, 
> then that clock should have an alias name of "system_pixel_ck" or 
> something similar that is meaningful to the DSS driver.  I think the 
> problem in this case is that "dss_dss_clk" is (optionally) used for two 
> purposes: optionally as a "main PRCM-provided functional clock" and 
> optionally as a system-provided pixel clock.

Not only for pixel clock, but in the end it'll come out as pixel clock.
I'm not sure what exactly is a "functional clock" here. I mean, one
could think it as a basic functionality of DSS to read the pixels,
manipulate them, and output them (with the rate of the pixel clock).

However, I think there is one difference between the clock used just to
enable the DSS registers, and the one used to output pixels: we need to
be able to adjust the rate of the clock. Thus we need to have a common
(omap2/3/4) clock name for it to be able to clk_get() it.

Should that clock name be just the "main" clock provided automatically,
or something else?

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-08 16:50             ` Paul Walmsley
@ 2011-04-11  9:09               ` Tomi Valkeinen
  0 siblings, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-11  9:09 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

On Fri, 2011-04-08 at 10:50 -0600, Paul Walmsley wrote:
> Hi Tomi,
> 
> On Mon, 4 Apr 2011, Tomi Valkeinen wrote:

> > Not directly related, but something I've been wondering about is how to
> > abstract the DSI/HDMI PLLs in DSS. What do you think, would it be
> > possible/worth it to create struct clks for the clocks coming out of
> > those PLLs? These would, of course, be DSS internal clks. I'm not very
> > familiar with the clock framework, so I don't really have any idea what
> > this would require and what would be the pros and cons.
> 
> Yes, I think it would be good to try to implement the entire DSS clock 
> tree in the clock framework.  One change to the clock code that we know 
> we'll need is to put a hwmod pointer in the struct clk which tells the 
> clock code that the hwmod needs to be enabled in order to access the 
> clock's registers.  Right now, the clock code assumes that all of the 
> clock registers are accessible, all of the time.

It's not quite that simple, as DSI PLL also needs the vdds_dsi regulator
to be enabled... And to use DSI PLL, not only do you need to access DSI
PLL registers, you also need to use DSI registers.

Is it possible to have the driver create its own clock structs when it's
loaded, and have the code for that clock inside the driver, or are
clocks something that has to be handled in the core platform code?

 Tomi




^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11  8:56                   ` Tomi Valkeinen
@ 2011-04-11 16:05                     ` Paul Walmsley
  2011-04-11 21:06                       ` Cousson, Benoit
                                         ` (2 more replies)
  0 siblings, 3 replies; 29+ messages in thread
From: Paul Walmsley @ 2011-04-11 16:05 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

[-- Attachment #1: Type: TEXT/PLAIN, Size: 7191 bytes --]

Hi

On Mon, 11 Apr 2011, Tomi Valkeinen wrote:

> On Fri, 2011-04-08 at 10:28 -0600, Paul Walmsley wrote:
> > On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
> > 
> > > > Also, I hope you and the other DSS hackers can finish the PM runtime
> > > > conversion of the DSS driver soon.  Ideally before any new DSS
> > > > features are added.  We really need to be able to separate the OMAP
> > > > integration details from the drivers, and right now, hwmod and PM
> > > > runtime are the best way we have to do that.
> > > 
> > > I also started to look at the PM runtime, but it doesn't fix the issue
> > > with the inconsistent clock name I described above.
> > 
> > After the hwmod/PM runtime conversion, I don't think any of the clock 
> > aliases currently in clock*_data.c should be used by the DSS driver (or by 
> > anything else on the system, for that matter).  That's because the 
> > omap_device code should set up the "main" alias for the DSS main 
> 
> When should "main" clock be used by the driver? Or never, and pm_runtime
> handles that?

If the DSS needs to change the parent or the clock rate of the main clock, 
then it will need to clk_get(dev, "main") and use the clock API.  My only 
point here was that the "main" alias should be automatically added by the 
omap_device code, not via the clock aliases in clock*_data.c.

> How about OMAP3? It also has an optional functional clock, but that
> doesn't seem to be set in dss_opt_clocks in omap_hwmod_3xxx_data.c.
> Should it be there?

Probably so.

> It seems dss1_alwon_fclk is currently the main clock for OMAP3 dss
> hwmods. Does that mean it can never be turned off if DSS is in use?

If the DSS driver were using PM runtime, then yes, that would be true.

> Ok. Then we need omap_hwmod_opt_clk for at least for VENC and HDMI, I
> believe.

In terms of the VENC, I'd agree with that -- based on OMAP4 Public TRM Rev 
O Figure 10-177 "Video Encoder Overview," it looks like VENC uses 
DSS_TV_FCLK.

In terms of the HDMI IP block, based on OMAP4 Public TRM Rev O Figure 
10-159 "HDMI Overview," it looks like sys_clk should be one of the 
optional clocks for HDMI?  Hard to tell from that diagram.

> > > - Should every DSS module have their own PM runtime handling? (actually
> > > related to the question above)
> > 
> > Yes, I think so.  From the integration perspective, we are trying to get 
> > to the point where each omap_device maps to only one hwmod.
> > 
> > > - If the modules are handled separately, how should the dependencies be 
> > > handled? For example, dss_core's reset will reset all the other modules 
> > > also, and most of the submodules need functions from dss_core and 
> > > dss_dispc. So should, say, dss_dsi then call functions in core and dispc 
> > > to "get" them, i.e. increase their pm runtime use count?
> > 
> > Probably not.
> > 
> > Here is how I would suggest structuring the code.  This is only a naïve 
> > suggestion; you and your team almost certainly know better than I.
> > 
> > I'd suggest that you separate low-level register access into .c files 
> > that are targeted specifically for the IP block.  So in the DSS case, 
> > you'd have dss.c, dispc.c, dsi.c, hdmi.c, rfbi.c, venc.c.  Each one should 
> > be a separate platform_device and would export symbols.  Hopefully, there 
> > should be no cross-dependencies between these low-level files.
> > 
> > Then you'd have "higher-level" code that might need to read/write from 
> > multiple DSS submodules to complete some higher-level operation.  That 
> > would be at least one separate driver -- say, "dss2" or something -- with 
> > dependencies on the low-level drivers.  So, for example, when that 
> > higher-level driver is modprobe'd, Linux would also load the drivers for 
> > the underlying hardware blocks that it uses.
> 
> But this still leaves my question open: If this "dss2" needs to use,
> say, dispc.c and dsi.c, those low level drivers need to be enabled. So I
> guess we would have something like dispc_get() or dispc_enable(), which
> dss2 would call first. Those functions would then use pm_runtime to
> enable the HW module. And the higher level driver would keep the low
> level devices enabled while its doing something.

That makes sense to me.

> I have been thinking something like this also earlier. It would separate
> things cleanly. One thing I don't like about it is the big amount of low
> level DSS internal functions that need to be exported.

Yeah, that's one of the downsides of that approach.

> > > - There seems to be some child/parent relationships in PM runtime.
> > > Should dss_core be the parent for the rest of the DSS modules? This
> > > would at least solve the reset issue easily, I guess.
> > 
> > Yes, I think that's more accurate, anyway.  Something isn't right with the 
> 
> How are the child/parent relationships done for omap_devices? Does it
> come somehow from the hwmod data? 

Right now, there's no explicit support in omap_device for parent/child 
relationships.  Probably the right place for that is in the omap_hwmod 
layer, since omap_device code just maps the hwmod data into the Linux 
device/driver model.  There is an interconnect hierarchy that's encoded in 
the omap_hwmod data, but currently there's no explicit handling for a case 
where a parent hwmod needs to be enabled for a child device to be 
accessed.  So far we haven't encountered any use-cases that require this, 
but I've suspected that this needs to be added to the hwmod code, and DSS 
may be the case that justifies it.

> > DSS hwmod data.  According to the OMAP4 Public TRM Rev O Table 10-3 "DSS 
> > Integration," there's a Sonics LX bus lurking in there.  All of the DSS 
> > submodules should have slave sockets with that Sonics LX bus as their 
> > master.  And the hwmod associated with the SLX should have an address 
> > range that covers all of the DSS submodules.  I assume that the logical 
> > hwmod to associate the SLX with is "dss_core", as you write.
> > 
> > Also, I notice the "CAUTION" boxes in Section 10.1.3 "DSS Register 
> > Manual", 10.2.7 "Display Controller Register Manual", etc. etc., that say 
> > that the DSS and submodules should be accessed through the L3 address 
> > space.  But all of the DSS hwmod register targets are listed as the L4_PER 
> > variants.  So the hwmod data also doesn't appear to be correct there.  The 
> > correct approach would be to have both address spaces listed in struct 
> > omap_hwmod_addr_space arrays, but to mark only the struct 
> > omap_hwmod_ocp_if entry associated with the L3 bus as OCP_USER_MPU | 
> > OCP_USER_SDMA[*].
> 
> As far as I'm concerned, L4 interface can be removed totally. TRM says
> "The access through the L4_PER interconnect is provided for back
> software compatibility.".

Okay, good to know.  We may leave them in there - the goal of the hwmod 
data is to describe the hardware independently of the Linux drivers.  But 
either way, the other set of addresses shouldn't appear to the DSS driver, 
so it's really a core code issue.


regards,

- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11  9:05                   ` Tomi Valkeinen
@ 2011-04-11 18:20                     ` Paul Walmsley
  2011-04-12  7:17                       ` Tomi Valkeinen
  0 siblings, 1 reply; 29+ messages in thread
From: Paul Walmsley @ 2011-04-11 18:20 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

Hi

On Mon, 11 Apr 2011, Tomi Valkeinen wrote:
> On Fri, 2011-04-08 at 08:55 -0600, Paul Walmsley wrote:
> > On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
> 
> > > and not the clock used for the pixel clock? If so, I'm fine with having 
> > > "fck" to be what it is currently, but then we need a new name for the 
> > > clock used for pixel clock, which is consistent on all platforms.
> > 
> > If there is a separate PRCM-provided clock used only for the pixel clock, 
> > then that clock should have an alias name of "system_pixel_ck" or 
> > something similar that is meaningful to the DSS driver.  I think the 
> > problem in this case is that "dss_dss_clk" is (optionally) used for two 
> > purposes: optionally as a "main PRCM-provided functional clock" and 
> > optionally as a system-provided pixel clock.
> 
> Not only for pixel clock, but in the end it'll come out as pixel clock.
> I'm not sure what exactly is a "functional clock" here. I mean, one
> could think it as a basic functionality of DSS to read the pixels,
> manipulate them, and output them (with the rate of the pixel clock).

Broadly speaking, a functional clock is defined negatively - 'anything 
that's not an interface clock.'  That's why the term 'functional clock' is 
not so useful by itself.  But when we talk about a module's 'main 
functional clock,' that means the functional clock that is needed for 
register accesses to work. 
 
> However, I think there is one difference between the clock used just to
> enable the DSS registers, and the one used to output pixels: we need to
> be able to adjust the rate of the clock. Thus we need to have a common
> (omap2/3/4) clock name for it to be able to clk_get() it.
>
> Should that clock name be just the "main" clock provided automatically,
> or something else?

Are you referring here to the system DPLL and its output dividers, or are 
you referring to the DSS module's internal dividers?


- Paul

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11 16:05                     ` Paul Walmsley
@ 2011-04-11 21:06                       ` Cousson, Benoit
  2011-04-11 21:29                       ` Cousson, Benoit
  2011-04-12  7:29                       ` Tomi Valkeinen
  2 siblings, 0 replies; 29+ messages in thread
From: Cousson, Benoit @ 2011-04-11 21:06 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Valkeinen, Tomi, Semwal, Sumit, Taneja, Archit, linux-omap

On 4/11/2011 6:05 PM, Paul Walmsley wrote:
> Hi
>
> On Mon, 11 Apr 2011, Tomi Valkeinen wrote:
>
>> On Fri, 2011-04-08 at 10:28 -0600, Paul Walmsley wrote:
>>> On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
>>>
>>>>> Also, I hope you and the other DSS hackers can finish the PM runtime
>>>>> conversion of the DSS driver soon.  Ideally before any new DSS
>>>>> features are added.  We really need to be able to separate the OMAP
>>>>> integration details from the drivers, and right now, hwmod and PM
>>>>> runtime are the best way we have to do that.
>>>>
>>>> I also started to look at the PM runtime, but it doesn't fix the issue
>>>> with the inconsistent clock name I described above.
>>>
>>> After the hwmod/PM runtime conversion, I don't think any of the clock
>>> aliases currently in clock*_data.c should be used by the DSS driver (or by
>>> anything else on the system, for that matter).  That's because the
>>> omap_device code should set up the "main" alias for the DSS main
>>
>> When should "main" clock be used by the driver? Or never, and pm_runtime
>> handles that?
>
> If the DSS needs to change the parent or the clock rate of the main clock,
> then it will need to clk_get(dev, "main") and use the clock API.  My only
> point here was that the "main" alias should be automatically added by the
> omap_device code, not via the clock aliases in clock*_data.c.
>
>> How about OMAP3? It also has an optional functional clock, but that
>> doesn't seem to be set in dss_opt_clocks in omap_hwmod_3xxx_data.c.
>> Should it be there?
>
> Probably so.
>
>> It seems dss1_alwon_fclk is currently the main clock for OMAP3 dss
>> hwmods. Does that mean it can never be turned off if DSS is in use?
>
> If the DSS driver were using PM runtime, then yes, that would be true.
>
>> Ok. Then we need omap_hwmod_opt_clk for at least for VENC and HDMI, I
>> believe.
>
> In terms of the VENC, I'd agree with that -- based on OMAP4 Public TRM Rev
> O Figure 10-177 "Video Encoder Overview," it looks like VENC uses
> DSS_TV_FCLK.
>
> In terms of the HDMI IP block, based on OMAP4 Public TRM Rev O Figure
> 10-159 "HDMI Overview," it looks like sys_clk should be one of the
> optional clocks for HDMI?  Hard to tell from that diagram.
>
>>>> - Should every DSS module have their own PM runtime handling? (actually
>>>> related to the question above)
>>>
>>> Yes, I think so.  From the integration perspective, we are trying to get
>>> to the point where each omap_device maps to only one hwmod.
>>>
>>>> - If the modules are handled separately, how should the dependencies be
>>>> handled? For example, dss_core's reset will reset all the other modules
>>>> also, and most of the submodules need functions from dss_core and
>>>> dss_dispc. So should, say, dss_dsi then call functions in core and dispc
>>>> to "get" them, i.e. increase their pm runtime use count?
>>>
>>> Probably not.
>>>
>>> Here is how I would suggest structuring the code.  This is only a naïve
>>> suggestion; you and your team almost certainly know better than I.
>>>
>>> I'd suggest that you separate low-level register access into .c files
>>> that are targeted specifically for the IP block.  So in the DSS case,
>>> you'd have dss.c, dispc.c, dsi.c, hdmi.c, rfbi.c, venc.c.  Each one should
>>> be a separate platform_device and would export symbols.  Hopefully, there
>>> should be no cross-dependencies between these low-level files.
>>>
>>> Then you'd have "higher-level" code that might need to read/write from
>>> multiple DSS submodules to complete some higher-level operation.  That
>>> would be at least one separate driver -- say, "dss2" or something -- with
>>> dependencies on the low-level drivers.  So, for example, when that
>>> higher-level driver is modprobe'd, Linux would also load the drivers for
>>> the underlying hardware blocks that it uses.
>>
>> But this still leaves my question open: If this "dss2" needs to use,
>> say, dispc.c and dsi.c, those low level drivers need to be enabled. So I
>> guess we would have something like dispc_get() or dispc_enable(), which
>> dss2 would call first. Those functions would then use pm_runtime to
>> enable the HW module. And the higher level driver would keep the low
>> level devices enabled while its doing something.
>
> That makes sense to me.
>
>> I have been thinking something like this also earlier. It would separate
>> things cleanly. One thing I don't like about it is the big amount of low
>> level DSS internal functions that need to be exported.
>
> Yeah, that's one of the downsides of that approach.
>
>>>> - There seems to be some child/parent relationships in PM runtime.
>>>> Should dss_core be the parent for the rest of the DSS modules? This
>>>> would at least solve the reset issue easily, I guess.
>>>
>>> Yes, I think that's more accurate, anyway.  Something isn't right with the
>>
>> How are the child/parent relationships done for omap_devices? Does it
>> come somehow from the hwmod data?
>
> Right now, there's no explicit support in omap_device for parent/child
> relationships.  Probably the right place for that is in the omap_hwmod
> layer, since omap_device code just maps the hwmod data into the Linux
> device/driver model.  There is an interconnect hierarchy that's encoded in
> the omap_hwmod data, but currently there's no explicit handling for a case
> where a parent hwmod needs to be enabled for a child device to be
> accessed.  So far we haven't encountered any use-cases that require this,
> but I've suspected that this needs to be added to the hwmod code, and DSS
> may be the case that justifies it.
>
>>> DSS hwmod data.  According to the OMAP4 Public TRM Rev O Table 10-3 "DSS
>>> Integration," there's a Sonics LX bus lurking in there.  All of the DSS
>>> submodules should have slave sockets with that Sonics LX bus as their
>>> master.  And the hwmod associated with the SLX should have an address
>>> range that covers all of the DSS submodules.  I assume that the logical
>>> hwmod to associate the SLX with is "dss_core", as you write.
>>>
>>> Also, I notice the "CAUTION" boxes in Section 10.1.3 "DSS Register
>>> Manual", 10.2.7 "Display Controller Register Manual", etc. etc., that say
>>> that the DSS and submodules should be accessed through the L3 address
>>> space.  But all of the DSS hwmod register targets are listed as the L4_PER
>>> variants.  So the hwmod data also doesn't appear to be correct there.

What version are you looking at? Both address spaces are already there 
today.

static struct omap_hwmod_addr_space omap44xx_dss_dma_addrs[] = {
	{
		.pa_start	= 0x58000000,
		.pa_end		= 0x5800007f,
		.flags		= ADDR_TYPE_RT
	},
};

/* l3_main_2 -> dss */
static struct omap_hwmod_ocp_if omap44xx_l3_main_2__dss = {
	.master		= &omap44xx_l3_main_2_hwmod,
	.slave		= &omap44xx_dss_hwmod,
	.clk		= "l3_div_ck",
	.addr		= omap44xx_dss_dma_addrs,
	.addr_cnt	= ARRAY_SIZE(omap44xx_dss_dma_addrs),
	.user		= OCP_USER_SDMA,
};

static struct omap_hwmod_addr_space omap44xx_dss_addrs[] = {
	{
		.pa_start	= 0x48040000,
		.pa_end		= 0x4804007f,
		.flags		= ADDR_TYPE_RT
	},
};

/* l4_per -> dss */
static struct omap_hwmod_ocp_if omap44xx_l4_per__dss = {
	.master		= &omap44xx_l4_per_hwmod,
	.slave		= &omap44xx_dss_hwmod,
	.clk		= "l4_div_ck",
	.addr		= omap44xx_dss_addrs,
	.addr_cnt	= ARRAY_SIZE(omap44xx_dss_addrs),
	.user		= OCP_USER_MPU,
};

/* dss slave ports */
static struct omap_hwmod_ocp_if *omap44xx_dss_slaves[] = {
	&omap44xx_l3_main_2__dss,
	&omap44xx_l4_per__dss,
};

>>> The
>>> correct approach would be to have both address spaces listed in struct
>>> omap_hwmod_addr_space arrays, but to mark only the struct
>>> omap_hwmod_ocp_if entry associated with the L3 bus as OCP_USER_MPU |
>>> OCP_USER_SDMA[*].

Today, hwmod will use only the L4 one just because the OCP_USER_MPU flag 
is used for that one only. We can just add the SDMA flag to L3 and 
remove the L4 mapping, if needed, but it will only change the one use by 
hwmod code. The driver will not impacted by that at all.

>> As far as I'm concerned, L4 interface can be removed totally. TRM says
>> "The access through the L4_PER interconnect is provided for back
>> software compatibility.".
>
> Okay, good to know.  We may leave them in there - the goal of the hwmod
> data is to describe the hardware independently of the Linux drivers.  But
> either way, the other set of addresses shouldn't appear to the DSS driver,
> so it's really a core code issue.

If we do that, we will have to name the address space to allow the 
driver to choose the proper one.
The is doable since we added that support for McBSP in 2.6.39.
I have some patches ready to add name address space for all IPs with 
dual mapping.

But in that case, removing the L4 completely will avoid any further 
change to the DSS driver. For the moment we are lucky just because the 
L3 entry is the first one in the list:-)

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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11 16:05                     ` Paul Walmsley
  2011-04-11 21:06                       ` Cousson, Benoit
@ 2011-04-11 21:29                       ` Cousson, Benoit
  2011-04-12  7:29                       ` Tomi Valkeinen
  2 siblings, 0 replies; 29+ messages in thread
From: Cousson, Benoit @ 2011-04-11 21:29 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Valkeinen, Tomi, Semwal, Sumit, Taneja, Archit, linux-omap

On 4/11/2011 6:05 PM, Paul Walmsley wrote:
> Hi
>
> On Mon, 11 Apr 2011, Tomi Valkeinen wrote:
>
>> On Fri, 2011-04-08 at 10:28 -0600, Paul Walmsley wrote:
>>> On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
>>>
>>>>> Also, I hope you and the other DSS hackers can finish the PM runtime
>>>>> conversion of the DSS driver soon.  Ideally before any new DSS
>>>>> features are added.  We really need to be able to separate the OMAP
>>>>> integration details from the drivers, and right now, hwmod and PM
>>>>> runtime are the best way we have to do that.
>>>>
>>>> I also started to look at the PM runtime, but it doesn't fix the issue
>>>> with the inconsistent clock name I described above.
>>>
>>> After the hwmod/PM runtime conversion, I don't think any of the clock
>>> aliases currently in clock*_data.c should be used by the DSS driver (or by
>>> anything else on the system, for that matter).  That's because the
>>> omap_device code should set up the "main" alias for the DSS main
>>
>> When should "main" clock be used by the driver? Or never, and pm_runtime
>> handles that?
>
> If the DSS needs to change the parent or the clock rate of the main clock,
> then it will need to clk_get(dev, "main") and use the clock API.  My only
> point here was that the "main" alias should be automatically added by the
> omap_device code, not via the clock aliases in clock*_data.c.

That will be doable only when main_clk will not be mapped to modulemode. 
You cannot change the clock rate of the modulemode since it is a fake 
clock :-(

>> How about OMAP3? It also has an optional functional clock, but that
>> doesn't seem to be set in dss_opt_clocks in omap_hwmod_3xxx_data.c.
>> Should it be there?
>
> Probably so.
>
>> It seems dss1_alwon_fclk is currently the main clock for OMAP3 dss
>> hwmods. Does that mean it can never be turned off if DSS is in use?
>
> If the DSS driver were using PM runtime, then yes, that would be true.

And then even if we switch to dss2 as the functional clock, dss1 cannot 
be gated.

>> Ok. Then we need omap_hwmod_opt_clk for at least for VENC and HDMI, I
>> believe.
>
> In terms of the VENC, I'd agree with that -- based on OMAP4 Public TRM Rev
> O Figure 10-177 "Video Encoder Overview," it looks like VENC uses
> DSS_TV_FCLK.

If we do have an hwmod for dss_venc, we might consider the tv_clk as the 
main clock, which is the case anyway. The only tricky part is the 
dependency with the dss modulemode / fclk that have to be enabled first.

> In terms of the HDMI IP block, based on OMAP4 Public TRM Rev O Figure
> 10-159 "HDMI Overview," it looks like sys_clk should be one of the
> optional clocks for HDMI?  Hard to tell from that diagram.
>
>>>> - Should every DSS module have their own PM runtime handling? (actually
>>>> related to the question above)
>>>
>>> Yes, I think so.  From the integration perspective, we are trying to get
>>> to the point where each omap_device maps to only one hwmod.
>>>
>>>> - If the modules are handled separately, how should the dependencies be
>>>> handled? For example, dss_core's reset will reset all the other modules
>>>> also, and most of the submodules need functions from dss_core and
>>>> dss_dispc. So should, say, dss_dsi then call functions in core and dispc
>>>> to "get" them, i.e. increase their pm runtime use count?
>>>
>>> Probably not.
>>>
>>> Here is how I would suggest structuring the code.  This is only a naïve
>>> suggestion; you and your team almost certainly know better than I.
>>>
>>> I'd suggest that you separate low-level register access into .c files
>>> that are targeted specifically for the IP block.  So in the DSS case,
>>> you'd have dss.c, dispc.c, dsi.c, hdmi.c, rfbi.c, venc.c.  Each one should
>>> be a separate platform_device and would export symbols.  Hopefully, there
>>> should be no cross-dependencies between these low-level files.
>>>
>>> Then you'd have "higher-level" code that might need to read/write from
>>> multiple DSS submodules to complete some higher-level operation.  That
>>> would be at least one separate driver -- say, "dss2" or something -- with
>>> dependencies on the low-level drivers.  So, for example, when that
>>> higher-level driver is modprobe'd, Linux would also load the drivers for
>>> the underlying hardware blocks that it uses.
>>
>> But this still leaves my question open: If this "dss2" needs to use,
>> say, dispc.c and dsi.c, those low level drivers need to be enabled. So I
>> guess we would have something like dispc_get() or dispc_enable(), which
>> dss2 would call first. Those functions would then use pm_runtime to
>> enable the HW module. And the higher level driver would keep the low
>> level devices enabled while its doing something.
>
> That makes sense to me.
>
>> I have been thinking something like this also earlier. It would separate
>> things cleanly. One thing I don't like about it is the big amount of low
>> level DSS internal functions that need to be exported.
>
> Yeah, that's one of the downsides of that approach.
>
>>>> - There seems to be some child/parent relationships in PM runtime.
>>>> Should dss_core be the parent for the rest of the DSS modules? This
>>>> would at least solve the reset issue easily, I guess.
>>>
>>> Yes, I think that's more accurate, anyway.  Something isn't right with the
>>
>> How are the child/parent relationships done for omap_devices? Does it
>> come somehow from the hwmod data?
>
> Right now, there's no explicit support in omap_device for parent/child
> relationships.  Probably the right place for that is in the omap_hwmod
> layer, since omap_device code just maps the hwmod data into the Linux
> device/driver model.  There is an interconnect hierarchy that's encoded in
> the omap_hwmod data, but currently there's no explicit handling for a case
> where a parent hwmod needs to be enabled for a child device to be
> accessed.  So far we haven't encountered any use-cases that require this,
> but I've suspected that this needs to be added to the hwmod code, and DSS
> may be the case that justifies it.

Do we really have to add that in hwmod core code? Cannot we let the 
driver stack handle that dependency? Assuming we have a device for the 
low level DSS code and assuming it is doing more than just enabling / 
disabling the module.

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

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11 18:20                     ` Paul Walmsley
@ 2011-04-12  7:17                       ` Tomi Valkeinen
  0 siblings, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-12  7:17 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

On Mon, 2011-04-11 at 12:20 -0600, Paul Walmsley wrote:
> Hi
> 
> On Mon, 11 Apr 2011, Tomi Valkeinen wrote:

> > However, I think there is one difference between the clock used just to
> > enable the DSS registers, and the one used to output pixels: we need to
> > be able to adjust the rate of the clock. Thus we need to have a common
> > (omap2/3/4) clock name for it to be able to clk_get() it.
> >
> > Should that clock name be just the "main" clock provided automatically,
> > or something else?
> 
> Are you referring here to the system DPLL and its output dividers, or are 
> you referring to the DSS module's internal dividers?

The system DPLL and its divider. If we are using the dss_dss_clk as
fclk, we need to adjust it depending on the required pixel clock and use
cases (e.g. some scaling factors may need higher fclk).

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: OMAP4 DSS clock setup
  2011-04-11 16:05                     ` Paul Walmsley
  2011-04-11 21:06                       ` Cousson, Benoit
  2011-04-11 21:29                       ` Cousson, Benoit
@ 2011-04-12  7:29                       ` Tomi Valkeinen
  2 siblings, 0 replies; 29+ messages in thread
From: Tomi Valkeinen @ 2011-04-12  7:29 UTC (permalink / raw)
  To: Paul Walmsley; +Cc: Cousson, Benoit, Semwal, Sumit, Taneja, Archit, linux-omap

On Mon, 2011-04-11 at 10:05 -0600, Paul Walmsley wrote:
> Hi
> 
> On Mon, 11 Apr 2011, Tomi Valkeinen wrote:
> 
> > On Fri, 2011-04-08 at 10:28 -0600, Paul Walmsley wrote:
> > > On Fri, 8 Apr 2011, Tomi Valkeinen wrote:
> > > 
> > > > > Also, I hope you and the other DSS hackers can finish the PM runtime
> > > > > conversion of the DSS driver soon.  Ideally before any new DSS
> > > > > features are added.  We really need to be able to separate the OMAP
> > > > > integration details from the drivers, and right now, hwmod and PM
> > > > > runtime are the best way we have to do that.
> > > > 
> > > > I also started to look at the PM runtime, but it doesn't fix the issue
> > > > with the inconsistent clock name I described above.
> > > 
> > > After the hwmod/PM runtime conversion, I don't think any of the clock 
> > > aliases currently in clock*_data.c should be used by the DSS driver (or by 
> > > anything else on the system, for that matter).  That's because the 
> > > omap_device code should set up the "main" alias for the DSS main 
> > 
> > When should "main" clock be used by the driver? Or never, and pm_runtime
> > handles that?
> 
> If the DSS needs to change the parent or the clock rate of the main clock, 
> then it will need to clk_get(dev, "main") and use the clock API.  My only 
> point here was that the "main" alias should be automatically added by the 
> omap_device code, not via the clock aliases in clock*_data.c.

Ok.

> > How about OMAP3? It also has an optional functional clock, but that
> > doesn't seem to be set in dss_opt_clocks in omap_hwmod_3xxx_data.c.
> > Should it be there?
> 
> Probably so.
> 
> > It seems dss1_alwon_fclk is currently the main clock for OMAP3 dss
> > hwmods. Does that mean it can never be turned off if DSS is in use?
> 
> If the DSS driver were using PM runtime, then yes, that would be true.

Ok. Then there's also room for improvement, as the dss1_alwon_fclk is an
optional clock on OMAP3.

> > Ok. Then we need omap_hwmod_opt_clk for at least for VENC and HDMI, I
> > believe.
> 
> In terms of the VENC, I'd agree with that -- based on OMAP4 Public TRM Rev 
> O Figure 10-177 "Video Encoder Overview," it looks like VENC uses 
> DSS_TV_FCLK.

On OMAP3 DSS_96M_FCLK goes to VENC's video DACs. I don't quite
understand how it goes in OMAP4, the clock tree figure shows something
going into VDAC, but it's unclear what. Well, anyway, the point was not
to dig out the clocks now, but just to point out that some extra clocks
are needed =).

> In terms of the HDMI IP block, based on OMAP4 Public TRM Rev O Figure 
> 10-159 "HDMI Overview," it looks like sys_clk should be one of the 
> optional clocks for HDMI?  Hard to tell from that diagram.

Yes, I think sys_clk is the input clock for the HDMI PLL. The output
from the PLL can then be used for DISPC fckl.

I believe HDMI_PHY_48M_FCLK ("dss_48mhz_clk") is also needed.

 Tomi



^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2011-04-12  7:29 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-30  6:48 OMAP4 DSS clock setup Tomi Valkeinen
2011-03-30  9:32 ` Cousson, Benoit
2011-03-30 11:03   ` Tomi Valkeinen
2011-03-30 12:12     ` Cousson, Benoit
2011-03-30 12:58       ` Tomi Valkeinen
2011-03-30 13:21         ` Cousson, Benoit
2011-03-31  6:42           ` Archit Taneja
2011-03-31  9:36             ` Cousson, Benoit
2011-03-31  7:34           ` Tomi Valkeinen
2011-04-02  2:12         ` Paul Walmsley
2011-04-04  6:53           ` Tomi Valkeinen
2011-04-06  9:09             ` Tomi Valkeinen
2011-04-07 19:27             ` Paul Walmsley
2011-04-08  5:51               ` Tomi Valkeinen
2011-04-08 14:55                 ` Paul Walmsley
2011-04-11  9:05                   ` Tomi Valkeinen
2011-04-11 18:20                     ` Paul Walmsley
2011-04-12  7:17                       ` Tomi Valkeinen
2011-04-08 15:36                 ` Cousson, Benoit
2011-04-08 16:35                   ` Tomi Valkeinen
2011-04-08 16:28                 ` Paul Walmsley
2011-04-11  8:56                   ` Tomi Valkeinen
2011-04-11 16:05                     ` Paul Walmsley
2011-04-11 21:06                       ` Cousson, Benoit
2011-04-11 21:29                       ` Cousson, Benoit
2011-04-12  7:29                       ` Tomi Valkeinen
2011-04-08 14:23               ` Cousson, Benoit
2011-04-08 16:50             ` Paul Walmsley
2011-04-11  9:09               ` Tomi Valkeinen

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).