RE: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-12-07 Thread Basak, Partha


> -Original Message-
> From: Kevin Hilman [mailto:khil...@deeprootsystems.com]
> Sent: Thursday, December 02, 2010 4:24 PM
> To: Cousson, Benoit
> Cc: Basak, Partha; ABRAHAM, KISHON VIJAY; Paul Walmsley; linux-
> o...@vger.kernel.org; Kamat, Nishant; Varadarajan, Charulatha; Datta,
> Shubhrajyoti; ext-eero.nurkk...@nokia.com; eduardo.valen...@nokia.com;
> Raja, Govindraj
> Subject: Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register
> modification for MCBSP
> 
> "Cousson, Benoit"  writes:
> 
> [...]
> 
> >
> > The issue is not really for the mcbsp but for the serial that need to
> > handle the 3 different states.
> >
> > if (enable) {
> > /**
> >  * Errata 2.15: [UART]:Cannot Acknowledge Idle Requests
> >  * in Smartidle Mode When Configured for DMA Operations.
> >  */
> > if (uart->dma_enabled)
> > idlemode = HWMOD_IDLEMODE_FORCE;
> > else
> > idlemode = HWMOD_IDLEMODE_SMART;
> > } else {
> > idlemode = HWMOD_IDLEMODE_NO;
> > }
> >
> > You do need to explicitly set the 3 modes, hence the following 3
> APIs:
> > omap_device_force_idle
> > omap_device_no_idle
> > omap_device_smart_idle

I am OK with Benoit's 3 + 1 API approach, 3 individual set functions and
one common function to restore back to the value as dictated by the flag.
What do you say guys?
> >
> > You can potentially add another API to restore the default idle mode:
> >
> > omap_device_default_idle
> >
> > That seems much simpler than 3 pairs of APIs.
> 
> My $0.02... based on the fact that we already have some IPs needing to
> conrol all 3 modes, I think having the 3 functions above is better than
> having 3 pairs of request/release functions.
> 
> Kevin
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-12-02 Thread Kevin Hilman
"Cousson, Benoit"  writes:

[...]

>
> The issue is not really for the mcbsp but for the serial that need to
> handle the 3 different states.
>
>   if (enable) {
>   /**
>* Errata 2.15: [UART]:Cannot Acknowledge Idle Requests
>* in Smartidle Mode When Configured for DMA Operations.
>*/
>   if (uart->dma_enabled)
>   idlemode = HWMOD_IDLEMODE_FORCE;
>   else
>   idlemode = HWMOD_IDLEMODE_SMART;
>   } else {
>   idlemode = HWMOD_IDLEMODE_NO;
>   }
>
> You do need to explicitly set the 3 modes, hence the following 3 APIs:
> omap_device_force_idle
> omap_device_no_idle
> omap_device_smart_idle
>
> You can potentially add another API to restore the default idle mode:
>
> omap_device_default_idle
>
> That seems much simpler than 3 pairs of APIs.

My $0.02... based on the fact that we already have some IPs needing to
conrol all 3 modes, I think having the 3 functions above is better than
having 3 pairs of request/release functions.

Kevin


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-12-01 Thread Govindraj
On Wed, Dec 1, 2010 at 4:45 PM, Cousson, Benoit  wrote:
> + Govindraj
>
> Hi Partha,
>
> On 12/1/2010 8:14 AM, Basak, Partha wrote:
>>
>>> From: Cousson, Benoit
>>> Sent: Tuesday, November 30, 2010 9:33 PM
>>>
>>> Hi Kishon,
>>>
>>> Sorry, for the delay.
>>>
>>> On 11/22/2010 4:59 PM, ABRAHAM, KISHON VIJAY wrote:

 Resending the mail in plain text format..

 On Mon, Nov 22, 2010 at 9:20 PM, ABRAHAM, KISHON VIJAY
>>>
>>> wrote:
>
> On Mon, Oct 11, 2010 at 11:48 AM, ABRAHAM, KISHON
>>>
>>> VIJAY   wrote:
>>
>> On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:
>>>
>>> Hi Kishon,
>>>
>>> On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:

 MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
 autoidle to be disabled before starting the sidetone. Also
>>>
>>> SYSCONFIG

 register has to be set with smart idle or no idle depending on
>>>
>>> the

 dma op mode (threshold or element sync). For doing these
>>>
>>> operations

 dynamically at runtime, hwmod API'S are used to modify SYSCONFIG
>>
>> register

 directly.
>>>
>>> OK, it looks like we don't have the choice... But for the
>>> implementation, please discussed with Manju on that, He is doing
>>>
>>> the
>>>
>>> similar thing for the smartstandby issue on SDMA.
>>
>>    OK.
>
>
>        Looks like we have a problem when we write an API similar to
>>>
>>> the one written
>
>        by Manju (omap_hwmod_set_master_standbymode()) [1]. In the
>>>
>>> case of McBSP,
>
>        I have to modify omap_hwmod_set_slave_idlemode() (which is
>>>
>>> already existing),
>
>        to include something like
>
>                          +    if (sf&   SYSC_HAS_SIDLEMODE) {
>                          +        if (idlemode)
>                          +            idlemode = HWMOD_IDLEMODE_NO;
>                          +        else
>                          +            idlemode = (oh->flags&
>>>
>>> HWMOD_SWSUP_SIDLE) ?
>
>                          +                HWMOD_IDLEMODE_NO :
>>>
>>> HWMOD_IDLEMODE_SMART;
>
>                          +    }
>>>
>>> How to you enable HWMOD_IDLEMODE_FORCE mode in that case?
>>>
>        Then an API like omap_device_require_no_idle() and
>>>
>>> omap_device_release_no_idle()
>
>        would be written similar to omap_device_require_no_mstandby
>>>
>>> and
>
>        omap_device_release_no_mstandby() (see [1]) that calls
>        omap_hwmod_set_slave_idlemode() with true/false. Passing true
>>>
>>> to
>
>        omap_hwmod_set_slave_idlemode() will write SIDLE bits with
>        HWMOD_IDLEMODE_NO and false to it will write
>        HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART depending on
>        HWMOD_SWSUP_SIDLE to SIDLE bits.
>
>        This works fine for McBSP since only two modes come to play
>>>
>>> here
>
>        (HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART).
>
>        But omap_hwmod_set_slave_idlemode() API is used by UART
>        (serial.c Please refer [2]) which writes SIDLE bits to
>        HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART/ and
>        HWMOD_IDLEMODE_FORCE.
>>>
>>> That code should not be there. It was a temporary hacks that should be
>>> replaced eventually with a clean omap_device API like the one you are
>>> currently implementing.
>>> There are a bunch of direct access to omap_hwmod struct that need to be
>>> removed as well.
>>>
>        Modifying omap_hwmod_set_slave_idlemode() will require
>            1) serial.c to be modified to call functions like
>>>
>>> 'omap_device_require_no_idle(),
>
>                omap_device_release_no_idle()' and
>>>
>>> 'omap_device_require_force_idle() and
>
>                omap_device_release_force_idle()' instead of
>                omap_hwmod_set_slave_idlemode() which is currently
>>>
>>> present.
>>>
>>> Yep, you're right.
>>>
>
>        There are 2 problems associated with it
>        1) The first problem is having a single API like
>>>
>>> omap_hwmod_set_slave_idlemode() to
>
>            set two different values like HWMOD_IDLEMODE_NO or
>            HWMOD_IDLEMODE_FORCE (intended to be called by
>>>
>>> omap_device_require_no_idle()
>
>            and omap_device_require_force_idle() respectively).
>>>
>>> According to the new design
>
>            omap_hwmod_set_slave_idlemode() is intended to take only
>>>
>>> true/false as
>
>            arguments.
>
>        2) The second problem is having the release API's
>>>
>>> (omap_device_release_no_idle() and
>
>             omap_device_release_force_idle()) to restore the
>>>
>>> SYSCONFIG to the previous state.
>
>             Remember, this was not problem for McBSP since only two
>>>
>>> mo

Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-12-01 Thread Cousson, Benoit

+ Govindraj

Hi Partha,

On 12/1/2010 8:14 AM, Basak, Partha wrote:



From: Cousson, Benoit
Sent: Tuesday, November 30, 2010 9:33 PM

Hi Kishon,

Sorry, for the delay.

On 11/22/2010 4:59 PM, ABRAHAM, KISHON VIJAY wrote:

Resending the mail in plain text format..

On Mon, Nov 22, 2010 at 9:20 PM, ABRAHAM, KISHON VIJAY

wrote:


On Mon, Oct 11, 2010 at 11:48 AM, ABRAHAM, KISHON

VIJAY   wrote:


On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:

Hi Kishon,

On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:

MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
autoidle to be disabled before starting the sidetone. Also

SYSCONFIG

register has to be set with smart idle or no idle depending on

the

dma op mode (threshold or element sync). For doing these

operations

dynamically at runtime, hwmod API'S are used to modify SYSCONFIG

register

directly.


OK, it looks like we don't have the choice... But for the
implementation, please discussed with Manju on that, He is doing

the

similar thing for the smartstandby issue on SDMA.


OK.



Looks like we have a problem when we write an API similar to

the one written

by Manju (omap_hwmod_set_master_standbymode()) [1]. In the

case of McBSP,

I have to modify omap_hwmod_set_slave_idlemode() (which is

already existing),

to include something like

  +if (sf&   SYSC_HAS_SIDLEMODE) {
  +if (idlemode)
  +idlemode = HWMOD_IDLEMODE_NO;
  +else
  +idlemode = (oh->flags&

HWMOD_SWSUP_SIDLE) ?

  +HWMOD_IDLEMODE_NO :

HWMOD_IDLEMODE_SMART;

  +}


How to you enable HWMOD_IDLEMODE_FORCE mode in that case?


Then an API like omap_device_require_no_idle() and

omap_device_release_no_idle()

would be written similar to omap_device_require_no_mstandby

and

omap_device_release_no_mstandby() (see [1]) that calls
omap_hwmod_set_slave_idlemode() with true/false. Passing true

to

omap_hwmod_set_slave_idlemode() will write SIDLE bits with
HWMOD_IDLEMODE_NO and false to it will write
HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART depending on
HWMOD_SWSUP_SIDLE to SIDLE bits.

This works fine for McBSP since only two modes come to play

here

(HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART).

But omap_hwmod_set_slave_idlemode() API is used by UART
(serial.c Please refer [2]) which writes SIDLE bits to
HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART/ and
HWMOD_IDLEMODE_FORCE.


That code should not be there. It was a temporary hacks that should be
replaced eventually with a clean omap_device API like the one you are
currently implementing.
There are a bunch of direct access to omap_hwmod struct that need to be
removed as well.


Modifying omap_hwmod_set_slave_idlemode() will require
1) serial.c to be modified to call functions like

'omap_device_require_no_idle(),

omap_device_release_no_idle()' and

'omap_device_require_force_idle() and

omap_device_release_force_idle()' instead of
omap_hwmod_set_slave_idlemode() which is currently

present.

Yep, you're right.



There are 2 problems associated with it
1) The first problem is having a single API like

omap_hwmod_set_slave_idlemode() to

set two different values like HWMOD_IDLEMODE_NO or
HWMOD_IDLEMODE_FORCE (intended to be called by

omap_device_require_no_idle()

and omap_device_require_force_idle() respectively).

According to the new design

omap_hwmod_set_slave_idlemode() is intended to take only

true/false as

arguments.

2) The second problem is having the release API's

(omap_device_release_no_idle() and

 omap_device_release_force_idle()) to restore the

SYSCONFIG to the previous state.

 Remember, this was not problem for McBSP since only two

modes were needed.

And what about 3 APIs?

omap_device_force_idle
omap_device_no_idle
omap_device_smart_idle


Want to reiterate Paul Walmsley's comments on Manju's DMA email dated 11/11/2010

2.  Rather than just using a single omap_device_mstandby() function call,
I'd rather see something like omap_device_require_no_standby() and
omap_device_release_no_standby().  omap_device_require_no_standby() would
force the initiator port into no-standby.
omap_device_release_no_standby() would return the initiator port
MSTANDBYMODE to whatever the state should be (this depends on whether
HWMOD_SWSUP_MSTDBY is set).  I'd rather not have the drivers manage the
contents of the MSTANDBYMODE bits directly.  Then you should be able to
drop _get_master_standbymode() and omap_hwmod_get_master_idlemode() also.
Can you please make these changes?


The key point

RE: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-11-30 Thread Basak, Partha


> -Original Message-
> From: Cousson, Benoit
> Sent: Tuesday, November 30, 2010 9:33 PM
> To: ABRAHAM, KISHON VIJAY; Paul Walmsley
> Cc: Kevin Hilman; Basak, Partha; linux-omap@vger.kernel.org; Kamat,
> Nishant; Varadarajan, Charulatha; Datta, Shubhrajyoti; ext-
> eero.nurkk...@nokia.com; eduardo.valen...@nokia.com
> Subject: Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register
> modification for MCBSP
> 
> Hi Kishon,
> 
> Sorry, for the delay.
> 
> On 11/22/2010 4:59 PM, ABRAHAM, KISHON VIJAY wrote:
> > Resending the mail in plain text format..
> >
> > On Mon, Nov 22, 2010 at 9:20 PM, ABRAHAM, KISHON VIJAY
> wrote:
> >>
> >> On Mon, Oct 11, 2010 at 11:48 AM, ABRAHAM, KISHON
> VIJAY  wrote:
> >>>
> >>> On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:
> >>>> Hi Kishon,
> >>>>
> >>>> On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:
> >>>>> MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
> >>>>> autoidle to be disabled before starting the sidetone. Also
> SYSCONFIG
> >>>>> register has to be set with smart idle or no idle depending on
> the
> >>>>> dma op mode (threshold or element sync). For doing these
> operations
> >>>>> dynamically at runtime, hwmod API'S are used to modify SYSCONFIG
> >>> register
> >>>>> directly.
> >>>>
> >>>> OK, it looks like we don't have the choice... But for the
> >>>> implementation, please discussed with Manju on that, He is doing
> the
> >>>> similar thing for the smartstandby issue on SDMA.
> >>>
> >>>OK.
> >>
> >>
> >>Looks like we have a problem when we write an API similar to
> the one written
> >>by Manju (omap_hwmod_set_master_standbymode()) [1]. In the
> case of McBSP,
> >>I have to modify omap_hwmod_set_slave_idlemode() (which is
> already existing),
> >>to include something like
> >>
> >>  +if (sf&  SYSC_HAS_SIDLEMODE) {
> >>  +if (idlemode)
> >>  +idlemode = HWMOD_IDLEMODE_NO;
> >>  +else
> >>  +idlemode = (oh->flags&
> HWMOD_SWSUP_SIDLE) ?
> >>  +HWMOD_IDLEMODE_NO :
> HWMOD_IDLEMODE_SMART;
> >>  +}
> 
> How to you enable HWMOD_IDLEMODE_FORCE mode in that case?
> 
> >>Then an API like omap_device_require_no_idle() and
> omap_device_release_no_idle()
> >>would be written similar to omap_device_require_no_mstandby
> and
> >>omap_device_release_no_mstandby() (see [1]) that calls
> >>omap_hwmod_set_slave_idlemode() with true/false. Passing true
> to
> >>omap_hwmod_set_slave_idlemode() will write SIDLE bits with
> >>HWMOD_IDLEMODE_NO and false to it will write
> >>HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART depending on
> >>HWMOD_SWSUP_SIDLE to SIDLE bits.
> >>
> >>This works fine for McBSP since only two modes come to play
> here
> >>(HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART).
> >>
> >>But omap_hwmod_set_slave_idlemode() API is used by UART
> >>(serial.c Please refer [2]) which writes SIDLE bits to
> >>HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART/ and
> >>HWMOD_IDLEMODE_FORCE.
> 
> That code should not be there. It was a temporary hacks that should be
> replaced eventually with a clean omap_device API like the one you are
> currently implementing.
> There are a bunch of direct access to omap_hwmod struct that need to be
> removed as well.
> 
> >>Modifying omap_hwmod_set_slave_idlemode() will require
> >>1) serial.c to be modified to call functions like
> 'omap_device_require_no_idle(),
> >>omap_device_release_no_idle()' and
> 'omap_device_require_force_idle() and
> >>omap_device_release_force_idle()' instead of
> >>omap_hwmod_set_slave_idlemode() which is currently
> present.
> 
> Yep, you're right.
> 
> >>
> >>There are 2 problems associated with it
> >>1) The first problem is having a single API like
> omap_hwmod_set_slave_idlemode() to
> >>set two 

Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-11-30 Thread Cousson, Benoit

Hi Kishon,

Sorry, for the delay.

On 11/22/2010 4:59 PM, ABRAHAM, KISHON VIJAY wrote:

Resending the mail in plain text format..

On Mon, Nov 22, 2010 at 9:20 PM, ABRAHAM, KISHON VIJAY  wrote:


On Mon, Oct 11, 2010 at 11:48 AM, ABRAHAM, KISHON VIJAY  wrote:


On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:

Hi Kishon,

On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:

MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
autoidle to be disabled before starting the sidetone. Also SYSCONFIG
register has to be set with smart idle or no idle depending on the
dma op mode (threshold or element sync). For doing these operations
dynamically at runtime, hwmod API'S are used to modify SYSCONFIG

register

directly.


OK, it looks like we don't have the choice... But for the
implementation, please discussed with Manju on that, He is doing the
similar thing for the smartstandby issue on SDMA.


   OK.



   Looks like we have a problem when we write an API similar to the one 
written
   by Manju (omap_hwmod_set_master_standbymode()) [1]. In the case of McBSP,
   I have to modify omap_hwmod_set_slave_idlemode() (which is already 
existing),
   to include something like

 +if (sf&  SYSC_HAS_SIDLEMODE) {
 +if (idlemode)
 +idlemode = HWMOD_IDLEMODE_NO;
 +else
 +idlemode = (oh->flags&  
HWMOD_SWSUP_SIDLE) ?
 +HWMOD_IDLEMODE_NO : 
HWMOD_IDLEMODE_SMART;
 +}


How to you enable HWMOD_IDLEMODE_FORCE mode in that case?


   Then an API like omap_device_require_no_idle() and 
omap_device_release_no_idle()
   would be written similar to omap_device_require_no_mstandby and
   omap_device_release_no_mstandby() (see [1]) that calls
   omap_hwmod_set_slave_idlemode() with true/false. Passing true to
   omap_hwmod_set_slave_idlemode() will write SIDLE bits with
   HWMOD_IDLEMODE_NO and false to it will write
   HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART depending on
   HWMOD_SWSUP_SIDLE to SIDLE bits.

   This works fine for McBSP since only two modes come to play here
   (HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART).

   But omap_hwmod_set_slave_idlemode() API is used by UART
   (serial.c Please refer [2]) which writes SIDLE bits to
   HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART/ and
   HWMOD_IDLEMODE_FORCE.


That code should not be there. It was a temporary hacks that should be 
replaced eventually with a clean omap_device API like the one you are 
currently implementing.
There are a bunch of direct access to omap_hwmod struct that need to be 
removed as well.



   Modifying omap_hwmod_set_slave_idlemode() will require
   1) serial.c to be modified to call functions like 
'omap_device_require_no_idle(),
   omap_device_release_no_idle()' and 
'omap_device_require_force_idle() and
   omap_device_release_force_idle()' instead of
   omap_hwmod_set_slave_idlemode() which is currently present.


Yep, you're right.



   There are 2 problems associated with it
   1) The first problem is having a single API like 
omap_hwmod_set_slave_idlemode() to
   set two different values like HWMOD_IDLEMODE_NO or
   HWMOD_IDLEMODE_FORCE (intended to be called by 
omap_device_require_no_idle()
   and omap_device_require_force_idle() respectively). According to the 
new design
   omap_hwmod_set_slave_idlemode() is intended to take only true/false 
as
   arguments.

   2) The second problem is having the release API's 
(omap_device_release_no_idle() and
omap_device_release_force_idle()) to restore the SYSCONFIG to the 
previous state.
Remember, this was not problem for McBSP since only two modes were 
needed.


And what about 3 APIs?

omap_device_force_idle
omap_device_no_idle
omap_device_smart_idle

It is probably much more appropriate than a require / release in that case?

Regards,
Benoit
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-11-22 Thread ABRAHAM, KISHON VIJAY
Resending the mail in plain text format..

On Mon, Nov 22, 2010 at 9:20 PM, ABRAHAM, KISHON VIJAY  wrote:
>
> On Mon, Oct 11, 2010 at 11:48 AM, ABRAHAM, KISHON VIJAY  wrote:
>>
>> On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:
>> > Hi Kishon,
>> >
>> > On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:
>> >> MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
>> >> autoidle to be disabled before starting the sidetone. Also SYSCONFIG
>> >> register has to be set with smart idle or no idle depending on the
>> >> dma op mode (threshold or element sync). For doing these operations
>> >> dynamically at runtime, hwmod API'S are used to modify SYSCONFIG
>> register
>> >> directly.
>> >
>> > OK, it looks like we don't have the choice... But for the
>> > implementation, please discussed with Manju on that, He is doing the
>> > similar thing for the smartstandby issue on SDMA.
>>
>>   OK.
>
>
>       Looks like we have a problem when we write an API similar to the one 
> written
>   by Manju (omap_hwmod_set_master_standbymode()) [1]. In the case of 
> McBSP,
>   I have to modify omap_hwmod_set_slave_idlemode() (which is already 
> existing),
>       to include something like
>
>     +    if (sf & SYSC_HAS_SIDLEMODE) {
>     +        if (idlemode)
>     +            idlemode = HWMOD_IDLEMODE_NO;
>     +        else
>     +            idlemode = (oh->flags & 
> HWMOD_SWSUP_SIDLE) ?
>     +                HWMOD_IDLEMODE_NO : 
> HWMOD_IDLEMODE_SMART;
>     +    }
>
>   Then an API like omap_device_require_no_idle() and 
> omap_device_release_no_idle()
>   would be written similar to omap_device_require_no_mstandby and
>   omap_device_release_no_mstandby() (see [1]) that calls
>   omap_hwmod_set_slave_idlemode() with true/false. Passing true to
>   omap_hwmod_set_slave_idlemode() will write SIDLE bits with
>   HWMOD_IDLEMODE_NO and false to it will write
>   HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART depending on
>   HWMOD_SWSUP_SIDLE to SIDLE bits.
>
>   This works fine for McBSP since only two modes come to play here
>   (HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART).
>
>   But omap_hwmod_set_slave_idlemode() API is used by UART
>   (serial.c Please refer [2]) which writes SIDLE bits to
>   HWMOD_IDLEMODE_NO/HWMOD_IDLEMODE_SMART/ and
>   HWMOD_IDLEMODE_FORCE.
>
>   Modifying omap_hwmod_set_slave_idlemode() will require
>   1) serial.c to be modified to call functions like 
> 'omap_device_require_no_idle(),
>   omap_device_release_no_idle()' and 
> 'omap_device_require_force_idle() and
>   omap_device_release_force_idle()' instead of
>   omap_hwmod_set_slave_idlemode() which is currently present.
>
>   There are 2 problems associated with it
>   1) The first problem is having a single API like 
> omap_hwmod_set_slave_idlemode() to
>   set two different values like HWMOD_IDLEMODE_NO or
>   HWMOD_IDLEMODE_FORCE (intended to be called by 
> omap_device_require_no_idle()
>   and omap_device_require_force_idle() respectively). According to 
> the new design
>   omap_hwmod_set_slave_idlemode() is intended to take only true/false 
> as
>   arguments.
>
>   2) The second problem is having the release API's 
> (omap_device_release_no_idle() and
>            omap_device_release_force_idle()) to restore the SYSCONFIG to the 
> previous state.
>    Remember, this was not problem for McBSP since only two modes were 
> needed.
>
>   Please provide your comment on this.
>
> -Kishon
>
>   [1] https://patchwork.kernel.org/patch/335591/
>   [2] 
> http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=blob;f=arch/arm/mach-omap2/serial.c;h=edd7c99de38dde5bf877788fb4e48055c0d9fbfa;hb=HEAD
>>
>> >
>> >>
>> >> Signed-off-by: Kishon Vijay Abraham I
>> >> Signed-off-by: Charulatha V
>> >> Signed-off-by: Shubhrajyoti D
>> >> Cc: Partha Basak
>> >> ---
>> >>    arch/arm/plat-omap/mcbsp.c |   69
>> ++--
>> >>    1 files changed, 41 insertions(+), 28 deletions(-)
>> >>
>> >> diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
>> >> index c7c6a83..6b705e1 100644
>> >> --- a/arch/arm/plat-omap/mcbsp.c
>> >> +++ b/arch/arm/plat-omap/mcbsp.c
>> >> @@ -228,10 +228,21 @@ void omap_mcbsp_config(unsigned int id, const
>> struct omap_mcbsp_reg_cfg *config)
>> >>    EXPORT_SYMBOL(omap_mcbsp_config);
>> >>
>> >>    #ifdef CONFIG_ARCH_OMAP3
>> >> +static struct omap_hwmod **find_hwmods_by_dev(struct device *dev)
>> >> +{
>> >> +    struct platform_device *pdev;
>> >> +    struct omap_device *od;
>> >> +    pdev = container_of(dev, struct platform_device, dev);
>> >> +    od = container_of(pdev, struct omap_device, pdev);
>> >> +    return od->hwmods;
>> >
>> > R

Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-10-10 Thread kishon

On Friday 08 October 2010 01:12 PM, Cousson, Benoit wrote:

Hi Kishon,

On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:

MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
autoidle to be disabled before starting the sidetone. Also SYSCONFIG
register has to be set with smart idle or no idle depending on the
dma op mode (threshold or element sync). For doing these operations
dynamically at runtime, hwmod API'S are used to modify SYSCONFIG register
directly.


OK, it looks like we don't have the choice... But for the
implementation, please discussed with Manju on that, He is doing the
similar thing for the smartstandby issue on SDMA.


  OK.





Signed-off-by: Kishon Vijay Abraham I
Signed-off-by: Charulatha V
Signed-off-by: Shubhrajyoti D
Cc: Partha Basak
---
   arch/arm/plat-omap/mcbsp.c |   69 
++--
   1 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index c7c6a83..6b705e1 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -228,10 +228,21 @@ void omap_mcbsp_config(unsigned int id, const struct 
omap_mcbsp_reg_cfg *config)
   EXPORT_SYMBOL(omap_mcbsp_config);

   #ifdef CONFIG_ARCH_OMAP3
+static struct omap_hwmod **find_hwmods_by_dev(struct device *dev)
+{
+   struct platform_device *pdev;
+   struct omap_device *od;
+   pdev = container_of(dev, struct platform_device, dev);
+   od = container_of(pdev, struct omap_device, pdev);
+   return od->hwmods;


Rule #1, don't touch oh in your code. The device should be the only
interface.
If such API is needed, it should be in omap_device. But in your case, I
don't thing it is needed.


  OK



+}
+
   static void omap_st_on(struct omap_mcbsp *mcbsp)
   {
unsigned int w;
+   struct omap_hwmod **oh;

+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Sidetone uses McBSP ICLK - which must not idle when sidetones
 * are enabled or sidetones start sounding ugly.
@@ -244,8 +255,7 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w&   ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);


Don't use internal hwmod API. You have to create a similar omap_device API.
You don't have to select only one hwmod in this case, just change the
sysconfig setting for all hwmod that belong to the omap_device, and it
will be fine. It will avoid you to access one hwmod in particular.
This is the implementation that Manju is doing.


  OK





/* Enable Sidetone from Sidetone Core */
w = MCBSP_ST_READ(mcbsp, SSELCR);
@@ -255,12 +265,14 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
   static void omap_st_off(struct omap_mcbsp *mcbsp)
   {
unsigned int w;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);

w = MCBSP_ST_READ(mcbsp, SSELCR);
MCBSP_ST_WRITE(mcbsp, SSELCR, w&   ~(ST_SIDETONEEN));

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
+   omap_hwmod_set_module_autoidle(oh[1], 1);

w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w&   ~(SIDETONEEN));
@@ -273,9 +285,11 @@ static void omap_st_off(struct omap_mcbsp *mcbsp)
   static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
   {
u16 val, i;
+   struct omap_hwmod **oh;

-   val = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val&   ~(ST_AUTOIDLE));
+   oh = find_hwmods_by_dev(mcbsp->dev);
+
+   omap_hwmod_set_module_autoidle(oh[1], 0);

val = MCBSP_ST_READ(mcbsp, SSELCR);

@@ -303,9 +317,11 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp)
   {
u16 w;
struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w&   ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);

w = MCBSP_ST_READ(mcbsp, SSELCR);

@@ -648,49 +664,46 @@ EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);

   static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
   {
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Enable wakup behavior, smart idle and all wakeups
 * REVISIT: some wakeups may be unnecessary
 */
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-   u16 syscon;
-
-   syscon = MCBSP_READ(mcbsp, SYSCON);
-   syscon&= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));

if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) {
-   syscon |= (ENAWAKEUP | SIDLEMODE(0x02) |
-   

Re: [PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-10-08 Thread Cousson, Benoit

Hi Kishon,

On 10/5/2010 6:37 PM, ABRAHAM, KISHON VIJAY wrote:

MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
autoidle to be disabled before starting the sidetone. Also SYSCONFIG
register has to be set with smart idle or no idle depending on the
dma op mode (threshold or element sync). For doing these operations
dynamically at runtime, hwmod API'S are used to modify SYSCONFIG register
directly.


OK, it looks like we don't have the choice... But for the 
implementation, please discussed with Manju on that, He is doing the 
similar thing for the smartstandby issue on SDMA.




Signed-off-by: Kishon Vijay Abraham I
Signed-off-by: Charulatha V
Signed-off-by: Shubhrajyoti D
Cc: Partha Basak
---
  arch/arm/plat-omap/mcbsp.c |   69 ++--
  1 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index c7c6a83..6b705e1 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -228,10 +228,21 @@ void omap_mcbsp_config(unsigned int id, const struct 
omap_mcbsp_reg_cfg *config)
  EXPORT_SYMBOL(omap_mcbsp_config);

  #ifdef CONFIG_ARCH_OMAP3
+static struct omap_hwmod **find_hwmods_by_dev(struct device *dev)
+{
+   struct platform_device *pdev;
+   struct omap_device *od;
+   pdev = container_of(dev, struct platform_device, dev);
+   od = container_of(pdev, struct omap_device, pdev);
+   return od->hwmods;


Rule #1, don't touch oh in your code. The device should be the only 
interface.
If such API is needed, it should be in omap_device. But in your case, I 
don't thing it is needed.



+}
+
  static void omap_st_on(struct omap_mcbsp *mcbsp)
  {
unsigned int w;
+   struct omap_hwmod **oh;

+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Sidetone uses McBSP ICLK - which must not idle when sidetones
 * are enabled or sidetones start sounding ugly.
@@ -244,8 +255,7 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w&  ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);


Don't use internal hwmod API. You have to create a similar omap_device API.
You don't have to select only one hwmod in this case, just change the 
sysconfig setting for all hwmod that belong to the omap_device, and it 
will be fine. It will avoid you to access one hwmod in particular.

This is the implementation that Manju is doing.



/* Enable Sidetone from Sidetone Core */
w = MCBSP_ST_READ(mcbsp, SSELCR);
@@ -255,12 +265,14 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
  static void omap_st_off(struct omap_mcbsp *mcbsp)
  {
unsigned int w;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);

w = MCBSP_ST_READ(mcbsp, SSELCR);
MCBSP_ST_WRITE(mcbsp, SSELCR, w&  ~(ST_SIDETONEEN));

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
+   omap_hwmod_set_module_autoidle(oh[1], 1);

w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w&  ~(SIDETONEEN));
@@ -273,9 +285,11 @@ static void omap_st_off(struct omap_mcbsp *mcbsp)
  static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
  {
u16 val, i;
+   struct omap_hwmod **oh;

-   val = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val&  ~(ST_AUTOIDLE));
+   oh = find_hwmods_by_dev(mcbsp->dev);
+
+   omap_hwmod_set_module_autoidle(oh[1], 0);

val = MCBSP_ST_READ(mcbsp, SSELCR);

@@ -303,9 +317,11 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp)
  {
u16 w;
struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);

-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w&  ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);

w = MCBSP_ST_READ(mcbsp, SSELCR);

@@ -648,49 +664,46 @@ EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);

  static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
  {
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Enable wakup behavior, smart idle and all wakeups
 * REVISIT: some wakeups may be unnecessary
 */
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-   u16 syscon;
-
-   syscon = MCBSP_READ(mcbsp, SYSCON);
-   syscon&= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));

if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) {
-   syscon |= (ENAWAKEUP | SIDLEMODE(0x02) |
-   CLOCKACTIVITY(0x02));
-   MCBSP_WRITE(mcbsp, WAKEUPEN, XR

[PATCH 6/7] [RFC] OMAP: hwmod: SYSCONFIG register modification for MCBSP

2010-10-05 Thread Kishon Vijay Abraham I
MCBSP 2 and 3 in OMAP3 has sidetone feature which requires
autoidle to be disabled before starting the sidetone. Also SYSCONFIG
register has to be set with smart idle or no idle depending on the
dma op mode (threshold or element sync). For doing these operations
dynamically at runtime, hwmod API'S are used to modify SYSCONFIG register
directly.

Signed-off-by: Kishon Vijay Abraham I 
Signed-off-by: Charulatha V 
Signed-off-by: Shubhrajyoti D 
Cc: Partha Basak 
---
 arch/arm/plat-omap/mcbsp.c |   69 ++--
 1 files changed, 41 insertions(+), 28 deletions(-)

diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index c7c6a83..6b705e1 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -228,10 +228,21 @@ void omap_mcbsp_config(unsigned int id, const struct 
omap_mcbsp_reg_cfg *config)
 EXPORT_SYMBOL(omap_mcbsp_config);
 
 #ifdef CONFIG_ARCH_OMAP3
+static struct omap_hwmod **find_hwmods_by_dev(struct device *dev)
+{
+   struct platform_device *pdev;
+   struct omap_device *od;
+   pdev = container_of(dev, struct platform_device, dev);
+   od = container_of(pdev, struct omap_device, pdev);
+   return od->hwmods;
+}
+
 static void omap_st_on(struct omap_mcbsp *mcbsp)
 {
unsigned int w;
+   struct omap_hwmod **oh;
 
+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Sidetone uses McBSP ICLK - which must not idle when sidetones
 * are enabled or sidetones start sounding ugly.
@@ -244,8 +255,7 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
 
-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);
 
/* Enable Sidetone from Sidetone Core */
w = MCBSP_ST_READ(mcbsp, SSELCR);
@@ -255,12 +265,14 @@ static void omap_st_on(struct omap_mcbsp *mcbsp)
 static void omap_st_off(struct omap_mcbsp *mcbsp)
 {
unsigned int w;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
 
w = MCBSP_ST_READ(mcbsp, SSELCR);
MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
 
-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
+   omap_hwmod_set_module_autoidle(oh[1], 1);
 
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
@@ -273,9 +285,11 @@ static void omap_st_off(struct omap_mcbsp *mcbsp)
 static void omap_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
 {
u16 val, i;
+   struct omap_hwmod **oh;
 
-   val = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, val & ~(ST_AUTOIDLE));
+   oh = find_hwmods_by_dev(mcbsp->dev);
+
+   omap_hwmod_set_module_autoidle(oh[1], 0);
 
val = MCBSP_ST_READ(mcbsp, SSELCR);
 
@@ -303,9 +317,11 @@ static void omap_st_chgain(struct omap_mcbsp *mcbsp)
 {
u16 w;
struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
 
-   w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
-   MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
+   omap_hwmod_set_module_autoidle(oh[1], 0);
 
w = MCBSP_ST_READ(mcbsp, SSELCR);
 
@@ -648,49 +664,46 @@ EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);
 
 static inline void omap34xx_mcbsp_request(struct omap_mcbsp *mcbsp)
 {
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Enable wakup behavior, smart idle and all wakeups
 * REVISIT: some wakeups may be unnecessary
 */
if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-   u16 syscon;
-
-   syscon = MCBSP_READ(mcbsp, SYSCON);
-   syscon &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
 
if (mcbsp->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD) {
-   syscon |= (ENAWAKEUP | SIDLEMODE(0x02) |
-   CLOCKACTIVITY(0x02));
-   MCBSP_WRITE(mcbsp, WAKEUPEN, XRDYEN | RRDYEN);
+   omap_hwmod_enable_wakeup(oh[0]);
+   omap_hwmod_set_slave_idlemode(oh[0],
+   HWMOD_IDLEMODE_SMART);
} else {
-   syscon |= SIDLEMODE(0x01);
+   omap_hwmod_disable_wakeup(oh[0]);
+   omap_hwmod_set_slave_idlemode(oh[0],
+   HWMOD_IDLEMODE_NO);
}
-
-   MCBSP_WRITE(mcbsp, SYSCON, syscon);
}
 }
 
 static inline void omap34xx_mcbsp_free(struct omap_mcbsp *mcbsp)
 {
+   struct omap_hwmod **oh;
+
+   oh = find_hwmods_by_dev(mcbsp->dev);
/*
 * Disable wakup behavior, smart idle and a