* Re: [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init
2011-11-17 10:11 [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
@ 2011-11-17 10:39 ` Cousson, Benoit
2011-11-17 11:53 ` Rajendra Nayak
2011-11-17 10:48 ` Govindraj
2011-11-17 19:35 ` Kevin Hilman
2 siblings, 1 reply; 8+ messages in thread
From: Cousson, Benoit @ 2011-11-17 10:39 UTC (permalink / raw)
To: Rajendra Nayak
Cc: linux-omap, tony, khilman, govindraj.raja, linux-arm-kernel,
linaro-dev, robherring2, Paul Walmsley
+ Paul
On 11/17/2011 11:11 AM, Rajendra Nayak wrote:
> A hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
> enabled state by the hwmod framework post the initial setup.
> Once a real user of the device (a driver) tries to enable it
> at a later point, the hmwod framework throws a WARN() about
typo: -------------------^
> the device being already in enabled state.
>
> Fix this by introducing a new state '_HWMOD_STATE_ENABLED_AT_INIT'
> to identify such devices/hwmods, so nothing but just a state
> change to '_HWMOD_STATE_ENABLED' can be done when the device/hwmod
> is requested to be enabled (the first time) by its driver/user.
>
> A good example of a such a device is an UART used as debug console.
> The UART module needs to be kept enabled through the boot, until the
> UART driver takes control of it, for debug prints to appear on
> the console.
>
> Signed-off-by: Rajendra Nayak<rnayak@ti.com>
> ---
> arch/arm/mach-omap2/omap_hwmod.c | 16 ++++++++++++++--
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 +
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index d7f4623..7d94cc3 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -1441,6 +1441,17 @@ static int _enable(struct omap_hwmod *oh)
>
> pr_debug("omap_hwmod: %s: enabling\n", oh->name);
>
> + /*
> + * hwmods' with HWMOD_INIT_NO_IDLE flag set, are left
Is the ' needed here? But I'm not an expert in English grammar...
> + * in enabled state at init.
> + * Now that someone is really trying to enable them,
> + * just update the state.
> + */
> + if (oh->_state == _HWMOD_STATE_ENABLED_AT_INIT) {
> + oh->_state = _HWMOD_STATE_ENABLED;
> + return 0;
> + }
> +
> if (oh->_state != _HWMOD_STATE_INITIALIZED&&
> oh->_state != _HWMOD_STATE_IDLE&&
> oh->_state != _HWMOD_STATE_DISABLED) {
> @@ -1449,7 +1460,6 @@ static int _enable(struct omap_hwmod *oh)
> return -EINVAL;
> }
>
> -
Not related to the patch changelog but that make senses to do it, so
just update the changelog.
> /*
> * If an IP contains only one HW reset line, then de-assert it in order
> * to allow the module state transition. Otherwise the PRCM will return
> @@ -1744,8 +1754,10 @@ static int _setup(struct omap_hwmod *oh, void *data)
> * it should be set by the core code as a runtime flag during startup
> */
> if ((oh->flags& HWMOD_INIT_NO_IDLE)&&
> - (postsetup_state == _HWMOD_STATE_IDLE))
> + (postsetup_state == _HWMOD_STATE_IDLE)) {
> + oh->_state = _HWMOD_STATE_ENABLED_AT_INIT;
> postsetup_state = _HWMOD_STATE_ENABLED;
> + }
>
> if (postsetup_state == _HWMOD_STATE_IDLE)
> _idle(oh);
> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> index 1b81dfb..cd49d60 100644
> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> @@ -436,6 +436,7 @@ struct omap_hwmod_omap4_prcm {
> #define _HWMOD_STATE_ENABLED 4
> #define _HWMOD_STATE_IDLE 5
> #define _HWMOD_STATE_DISABLED 6
> +#define _HWMOD_STATE_ENABLED_AT_INIT 7
You should update the comment before... yeah I know, the other states
are not documented, but they are much more understandable than this new one.
> /**
> * struct omap_hwmod_class - the type of an IP block
+1 Looks good to me but someone else must approve...
Oops, sorry its not Gerrit :-)
Acked-by: Benoit Cousson <b-cousson@ti.com>
Thanks,
Benoit
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init
2011-11-17 10:39 ` Cousson, Benoit
@ 2011-11-17 11:53 ` Rajendra Nayak
0 siblings, 0 replies; 8+ messages in thread
From: Rajendra Nayak @ 2011-11-17 11:53 UTC (permalink / raw)
To: Cousson, Benoit
Cc: linux-omap, tony, khilman, govindraj.raja, linux-arm-kernel,
linaro-dev, robherring2, Paul Walmsley
On Thursday 17 November 2011 04:09 PM, Cousson, Benoit wrote:
> + Paul
>
> On 11/17/2011 11:11 AM, Rajendra Nayak wrote:
>> A hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
>> enabled state by the hwmod framework post the initial setup.
>> Once a real user of the device (a driver) tries to enable it
>> at a later point, the hmwod framework throws a WARN() about
>
> typo: -------------------^
>
>> the device being already in enabled state.
>>
>> Fix this by introducing a new state '_HWMOD_STATE_ENABLED_AT_INIT'
>> to identify such devices/hwmods, so nothing but just a state
>> change to '_HWMOD_STATE_ENABLED' can be done when the device/hwmod
>> is requested to be enabled (the first time) by its driver/user.
>>
>> A good example of a such a device is an UART used as debug console.
>> The UART module needs to be kept enabled through the boot, until the
>> UART driver takes control of it, for debug prints to appear on
>> the console.
>>
>> Signed-off-by: Rajendra Nayak<rnayak@ti.com>
>> ---
>> arch/arm/mach-omap2/omap_hwmod.c | 16 ++++++++++++++--
>> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 +
>> 2 files changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c
>> b/arch/arm/mach-omap2/omap_hwmod.c
>> index d7f4623..7d94cc3 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod.c
>> @@ -1441,6 +1441,17 @@ static int _enable(struct omap_hwmod *oh)
>>
>> pr_debug("omap_hwmod: %s: enabling\n", oh->name);
>>
>> + /*
>> + * hwmods' with HWMOD_INIT_NO_IDLE flag set, are left
>
> Is the ' needed here? But I'm not an expert in English grammar...
Me neither, lets ask Paul :)
>
>> + * in enabled state at init.
>> + * Now that someone is really trying to enable them,
>> + * just update the state.
>> + */
>> + if (oh->_state == _HWMOD_STATE_ENABLED_AT_INIT) {
>> + oh->_state = _HWMOD_STATE_ENABLED;
>> + return 0;
>> + }
>> +
>> if (oh->_state != _HWMOD_STATE_INITIALIZED&&
>> oh->_state != _HWMOD_STATE_IDLE&&
>> oh->_state != _HWMOD_STATE_DISABLED) {
>> @@ -1449,7 +1460,6 @@ static int _enable(struct omap_hwmod *oh)
>> return -EINVAL;
>> }
>>
>> -
>
> Not related to the patch changelog but that make senses to do it, so
> just update the changelog.
No, its just a stay change. I'll get rid of it.
>
>> /*
>> * If an IP contains only one HW reset line, then de-assert it in order
>> * to allow the module state transition. Otherwise the PRCM will return
>> @@ -1744,8 +1754,10 @@ static int _setup(struct omap_hwmod *oh, void
>> *data)
>> * it should be set by the core code as a runtime flag during startup
>> */
>> if ((oh->flags& HWMOD_INIT_NO_IDLE)&&
>> - (postsetup_state == _HWMOD_STATE_IDLE))
>> + (postsetup_state == _HWMOD_STATE_IDLE)) {
>> + oh->_state = _HWMOD_STATE_ENABLED_AT_INIT;
>> postsetup_state = _HWMOD_STATE_ENABLED;
>> + }
>>
>> if (postsetup_state == _HWMOD_STATE_IDLE)
>> _idle(oh);
>> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> b/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> index 1b81dfb..cd49d60 100644
>> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
>> @@ -436,6 +436,7 @@ struct omap_hwmod_omap4_prcm {
>> #define _HWMOD_STATE_ENABLED 4
>> #define _HWMOD_STATE_IDLE 5
>> #define _HWMOD_STATE_DISABLED 6
>> +#define _HWMOD_STATE_ENABLED_AT_INIT 7
>
> You should update the comment before... yeah I know, the other states
> are not documented, but they are much more understandable than this new
> one.
Yeah, makes sense. Will add comments.
>
>> /**
>> * struct omap_hwmod_class - the type of an IP block
>
> +1 Looks good to me but someone else must approve...
> Oops, sorry its not Gerrit :-)
>
> Acked-by: Benoit Cousson <b-cousson@ti.com>
>
> Thanks,
> Benoit
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init
2011-11-17 10:11 [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
2011-11-17 10:39 ` Cousson, Benoit
@ 2011-11-17 10:48 ` Govindraj
2011-11-17 19:35 ` Kevin Hilman
2 siblings, 0 replies; 8+ messages in thread
From: Govindraj @ 2011-11-17 10:48 UTC (permalink / raw)
To: Rajendra Nayak
Cc: b-cousson, linux-omap, tony, khilman, govindraj.raja,
linux-arm-kernel, linaro-dev, robherring2
On Thu, Nov 17, 2011 at 3:41 PM, Rajendra Nayak <rnayak@ti.com> wrote:
> A hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
> enabled state by the hwmod framework post the initial setup.
> Once a real user of the device (a driver) tries to enable it
> at a later point, the hmwod framework throws a WARN() about
> the device being already in enabled state.
>
> Fix this by introducing a new state '_HWMOD_STATE_ENABLED_AT_INIT'
> to identify such devices/hwmods, so nothing but just a state
> change to '_HWMOD_STATE_ENABLED' can be done when the device/hwmod
> is requested to be enabled (the first time) by its driver/user.
>
> A good example of a such a device is an UART used as debug console.
> The UART module needs to be kept enabled through the boot, until the
> UART driver takes control of it, for debug prints to appear on
> the console.
>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
tested with uart runtime v8 patch series works fine.
helps to simply the serial.c code without using custom console activate funcs.
thanks for handling this within the framework.
FWIW,
Tested-by: Govindraj.R <govindraj.raja@ti.com>
--
Thanks,
Govindraj.R
> ---
> arch/arm/mach-omap2/omap_hwmod.c | 16 ++++++++++++++--
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 +
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index d7f4623..7d94cc3 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -1441,6 +1441,17 @@ static int _enable(struct omap_hwmod *oh)
>
> pr_debug("omap_hwmod: %s: enabling\n", oh->name);
>
> + /*
> + * hwmods' with HWMOD_INIT_NO_IDLE flag set, are left
> + * in enabled state at init.
> + * Now that someone is really trying to enable them,
> + * just update the state.
> + */
> + if (oh->_state == _HWMOD_STATE_ENABLED_AT_INIT) {
> + oh->_state = _HWMOD_STATE_ENABLED;
> + return 0;
> + }
> +
> if (oh->_state != _HWMOD_STATE_INITIALIZED &&
> oh->_state != _HWMOD_STATE_IDLE &&
> oh->_state != _HWMOD_STATE_DISABLED) {
> @@ -1449,7 +1460,6 @@ static int _enable(struct omap_hwmod *oh)
> return -EINVAL;
> }
>
> -
> /*
> * If an IP contains only one HW reset line, then de-assert it in order
> * to allow the module state transition. Otherwise the PRCM will return
> @@ -1744,8 +1754,10 @@ static int _setup(struct omap_hwmod *oh, void *data)
> * it should be set by the core code as a runtime flag during startup
> */
> if ((oh->flags & HWMOD_INIT_NO_IDLE) &&
> - (postsetup_state == _HWMOD_STATE_IDLE))
> + (postsetup_state == _HWMOD_STATE_IDLE)) {
> + oh->_state = _HWMOD_STATE_ENABLED_AT_INIT;
> postsetup_state = _HWMOD_STATE_ENABLED;
> + }
>
> if (postsetup_state == _HWMOD_STATE_IDLE)
> _idle(oh);
> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> index 1b81dfb..cd49d60 100644
> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> @@ -436,6 +436,7 @@ struct omap_hwmod_omap4_prcm {
> #define _HWMOD_STATE_ENABLED 4
> #define _HWMOD_STATE_IDLE 5
> #define _HWMOD_STATE_DISABLED 6
> +#define _HWMOD_STATE_ENABLED_AT_INIT 7
>
> /**
> * struct omap_hwmod_class - the type of an IP block
> --
> 1.7.1
>
> --
> 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
>
--
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] 8+ messages in thread* Re: [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init
2011-11-17 10:11 [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
2011-11-17 10:39 ` Cousson, Benoit
2011-11-17 10:48 ` Govindraj
@ 2011-11-17 19:35 ` Kevin Hilman
2011-11-18 6:44 ` Rajendra Nayak
2 siblings, 1 reply; 8+ messages in thread
From: Kevin Hilman @ 2011-11-17 19:35 UTC (permalink / raw)
To: Rajendra Nayak
Cc: b-cousson, linux-omap, tony, govindraj.raja, linux-arm-kernel,
linaro-dev, robherring2
Rajendra Nayak <rnayak@ti.com> writes:
> A hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
> enabled state by the hwmod framework post the initial setup.
> Once a real user of the device (a driver) tries to enable it
> at a later point, the hmwod framework throws a WARN() about
> the device being already in enabled state.
>
> Fix this by introducing a new state '_HWMOD_STATE_ENABLED_AT_INIT'
> to identify such devices/hwmods, so nothing but just a state
> change to '_HWMOD_STATE_ENABLED' can be done when the device/hwmod
> is requested to be enabled (the first time) by its driver/user.
>
> A good example of a such a device is an UART used as debug console.
> The UART module needs to be kept enabled through the boot, until the
> UART driver takes control of it, for debug prints to appear on
> the console.
Nice. This is indeed much cleaner than what we're doing in the UART
code. However...
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>
> ---
> arch/arm/mach-omap2/omap_hwmod.c | 16 ++++++++++++++--
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 +
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index d7f4623..7d94cc3 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -1441,6 +1441,17 @@ static int _enable(struct omap_hwmod *oh)
>
> pr_debug("omap_hwmod: %s: enabling\n", oh->name);
>
> + /*
> + * hwmods' with HWMOD_INIT_NO_IDLE flag set, are left
(no the ' isn't necessary)
> + * in enabled state at init.
> + * Now that someone is really trying to enable them,
> + * just update the state.
> + */
> + if (oh->_state == _HWMOD_STATE_ENABLED_AT_INIT) {
> + oh->_state = _HWMOD_STATE_ENABLED;
> + return 0;
> + }
...this subtly changes the behavior, at least compared to how the UART
code handles this today.
One thing that this doesn't do that the current UART code does is ensure
that the IP is actually in a state that can properly idle after this is
done.
For example, if the bootloader is dumb (most are) and has configured the
UARTs in mode that prevents idle (e.g. no-idle mode), then these UARTs
will never allow the SoC to hit low power states.
So, what's really needed is not just a return here, but an _idle() and
then continue so we know that the HW is in a state that we know can
idle from here on out.
Kevin
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] ARM: omap_hwmod: Add a new state to handle hwmods left enabled at init
2011-11-17 19:35 ` Kevin Hilman
@ 2011-11-18 6:44 ` Rajendra Nayak
[not found] ` <4EC5FED0.3000202-l0cyMroinI0@public.gmane.org>
0 siblings, 1 reply; 8+ messages in thread
From: Rajendra Nayak @ 2011-11-18 6:44 UTC (permalink / raw)
To: Kevin Hilman
Cc: b-cousson, linux-omap, tony, govindraj.raja, linux-arm-kernel,
linaro-dev, robherring2
Hi Kevin,
On Friday 18 November 2011 01:05 AM, Kevin Hilman wrote:
> Rajendra Nayak<rnayak@ti.com> writes:
>
>> A hwmod with a 'HWMOD_INIT_NO_IDLE' flag set, is left in
>> enabled state by the hwmod framework post the initial setup.
>> Once a real user of the device (a driver) tries to enable it
>> at a later point, the hmwod framework throws a WARN() about
>> the device being already in enabled state.
>>
>> Fix this by introducing a new state '_HWMOD_STATE_ENABLED_AT_INIT'
>> to identify such devices/hwmods, so nothing but just a state
>> change to '_HWMOD_STATE_ENABLED' can be done when the device/hwmod
>> is requested to be enabled (the first time) by its driver/user.
>>
>> A good example of a such a device is an UART used as debug console.
>> The UART module needs to be kept enabled through the boot, until the
>> UART driver takes control of it, for debug prints to appear on
>> the console.
>
> Nice. This is indeed much cleaner than what we're doing in the UART
> code. However...
>
>> Signed-off-by: Rajendra Nayak<rnayak@ti.com>
>> ---
>> arch/arm/mach-omap2/omap_hwmod.c | 16 ++++++++++++++--
>> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 +
>> 2 files changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
>> index d7f4623..7d94cc3 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod.c
>> @@ -1441,6 +1441,17 @@ static int _enable(struct omap_hwmod *oh)
>>
>> pr_debug("omap_hwmod: %s: enabling\n", oh->name);
>>
>> + /*
>> + * hwmods' with HWMOD_INIT_NO_IDLE flag set, are left
>
> (no the ' isn't necessary)
>
>> + * in enabled state at init.
>> + * Now that someone is really trying to enable them,
>> + * just update the state.
>> + */
>> + if (oh->_state == _HWMOD_STATE_ENABLED_AT_INIT) {
>> + oh->_state = _HWMOD_STATE_ENABLED;
>> + return 0;
>> + }
>
> ...this subtly changes the behavior, at least compared to how the UART
> code handles this today.
>
> One thing that this doesn't do that the current UART code does is ensure
> that the IP is actually in a state that can properly idle after this is
> done.
>
> For example, if the bootloader is dumb (most are) and has configured the
> UARTs in mode that prevents idle (e.g. no-idle mode), then these UARTs
> will never allow the SoC to hit low power states.
>
> So, what's really needed is not just a return here, but an _idle() and
> then continue so we know that the HW is in a state that we know can
> idle from here on out.
I don't know if I completely understand what you are saying.
The above change is in the _enable() call which would be triggered
as part of runtime call from the serial driver to enable the module.
(Since the module is already enabled, you just change state to suggest
its now enabled by its user, rather than 'left enabled' at init)
There would be another call from the serial driver to idle it when
a corresponding hwmod _idle() call would idle the device.
I don't seem to understand why would a call to _idle() be needed
in an _enable() call.
regards,
Rajendra
>
> Kevin
^ permalink raw reply [flat|nested] 8+ messages in thread