linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init
@ 2011-11-21 12:12 Rajendra Nayak
  2011-11-21 18:38 ` Kevin Hilman
  2011-12-16 10:37 ` Paul Walmsley
  0 siblings, 2 replies; 4+ messages in thread
From: Rajendra Nayak @ 2011-11-21 12:12 UTC (permalink / raw)
  To: linux-arm-kernel

An 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 hwmod 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. When the device/hwmod
is requested to be enabled (the first time) by its driver/user,
nothing except the mux-enable and a state change to '_HWMOD_STATE_ENABLED'
is needed. The mux data is board specific and is unavailable during
initial enable() of the device, done by the framework as part of
setup().

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.

Acked-by: Kevin Hilman <khilman@ti.com>
Acked-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod.c             |   23 ++++++++++++++++++++++-
 arch/arm/plat-omap/include/plat/omap_hwmod.h |    6 ++++++
 2 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 6b3088d..166a42d 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1441,6 +1441,25 @@ 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) {
+		/*
+		 * If the caller has mux data populated, do the mux'ing
+		 * which wouldn't have been done as part of the _enable()
+		 * done during setup.
+		 */
+		if (oh->mux)
+			omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
+
+		oh->_state = _HWMOD_STATE_ENABLED;
+		return 0;
+	}
+
 	if (oh->_state != _HWMOD_STATE_INITIALIZED &&
 	    oh->_state != _HWMOD_STATE_IDLE &&
 	    oh->_state != _HWMOD_STATE_DISABLED) {
@@ -1744,8 +1763,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 8b372ed..2bd3929 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -436,6 +436,12 @@ struct omap_hwmod_omap4_prcm {
 #define _HWMOD_STATE_ENABLED			4
 #define _HWMOD_STATE_IDLE			5
 #define _HWMOD_STATE_DISABLED			6
+/*
+ * This state signifies the hwmod was left enabled
+ * after init, by the framework, because of the
+ * 'HWMOD_INIT_NO_IDLE' flag.
+ */
+#define _HWMOD_STATE_ENABLED_AT_INIT		7
 
 /**
  * struct omap_hwmod_class - the type of an IP block
-- 
1.7.1

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

* [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init
  2011-11-21 12:12 [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
@ 2011-11-21 18:38 ` Kevin Hilman
  2011-12-16 10:37 ` Paul Walmsley
  1 sibling, 0 replies; 4+ messages in thread
From: Kevin Hilman @ 2011-11-21 18:38 UTC (permalink / raw)
  To: linux-arm-kernel

Rajendra Nayak <rnayak@ti.com> writes:

> An 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 hwmod 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. When the device/hwmod
> is requested to be enabled (the first time) by its driver/user,
> nothing except the mux-enable and a state change to '_HWMOD_STATE_ENABLED'
> is needed. The mux data is board specific and is unavailable during
> initial enable() of the device, done by the framework as part of
> setup().
>
> 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.
>
> Acked-by: Kevin Hilman <khilman@ti.com>
> Acked-by: Benoit Cousson <b-cousson@ti.com>

Looks like we need a

Tested-by: Govindraj Raja <govindraj.raja@ti.com>

here as well.   Thanks Govindraj for testing.

> Signed-off-by: Rajendra Nayak <rnayak@ti.com>


Kevin

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

* [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init
  2011-11-21 12:12 [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
  2011-11-21 18:38 ` Kevin Hilman
@ 2011-12-16 10:37 ` Paul Walmsley
  2011-12-16 11:03   ` Rajendra Nayak
  1 sibling, 1 reply; 4+ messages in thread
From: Paul Walmsley @ 2011-12-16 10:37 UTC (permalink / raw)
  To: linux-arm-kernel

Hi

On Mon, 21 Nov 2011, Rajendra Nayak wrote:

> An 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 hwmod 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. When the device/hwmod
> is requested to be enabled (the first time) by its driver/user,
> nothing except the mux-enable and a state change to '_HWMOD_STATE_ENABLED'
> is needed. The mux data is board specific and is unavailable during
> initial enable() of the device, done by the framework as part of
> setup().
> 
> 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.
> 
> Acked-by: Kevin Hilman <khilman@ti.com>
> Acked-by: Benoit Cousson <b-cousson@ti.com>
> Signed-off-by: Rajendra Nayak <rnayak@ti.com>

I've tweaked this patch a little bit, mostly to avoid adding a new state, 
which increases the complexity of the rest of the code that handles the 
hwmod state machine.  The modified patch below just uses an internal flag.  
Please let me know if you have any comments.


- Paul


From: Rajendra Nayak <rnayak@ti.com>
Date: Mon, 21 Nov 2011 17:42:50 +0530
Subject: [PATCH] ARM: OMAP2+: hwmod: Add a new flag to handle hwmods left
 enabled at init

An 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 hwmod framework throws a WARN() about
the device being already in enabled state.

Fix this by introducing a new internal '_HWMOD_SKIP_ENABLE' to
identify such devices/hwmods. When the device/hwmod is requested to be
enabled (the first time) by its driver/user, nothing except the
mux-enable is needed. The mux data is board specific and is
unavailable during initial enable() of the device, done by the
framework as part of setup().

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.

Acked-by: Kevin Hilman <khilman@ti.com>
Acked-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
[paul at pwsan.com: use a flag rather than a state; updated commit message;
 edited some documentation]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
---
 arch/arm/mach-omap2/omap_hwmod.c             |   23 ++++++++++++++++++++++-
 arch/arm/plat-omap/include/plat/omap_hwmod.h |    3 +++
 2 files changed, 25 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index ebace0f..0a89335 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1449,6 +1449,25 @@ 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 ensure that the hwmod mux is set.
+	 */
+	if (oh->_int_flags & _HWMOD_SKIP_ENABLE) {
+		/*
+		 * If the caller has mux data populated, do the mux'ing
+		 * which wouldn't have been done as part of the _enable()
+		 * done during setup.
+		 */
+		if (oh->mux)
+			omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
+
+		oh->_int_flags &= ~_HWMOD_SKIP_ENABLE;
+		return 0;
+	}
+
 	if (oh->_state != _HWMOD_STATE_INITIALIZED &&
 	    oh->_state != _HWMOD_STATE_IDLE &&
 	    oh->_state != _HWMOD_STATE_DISABLED) {
@@ -1744,8 +1763,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->_int_flags |= _HWMOD_SKIP_ENABLE;
 		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 8b372ed..1a13c02 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -416,10 +416,13 @@ struct omap_hwmod_omap4_prcm {
  * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module
  * _HWMOD_WAKEUP_ENABLED: set when the omap_hwmod code has enabled ENAWAKEUP
  * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached
+ * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) -
+ *     causes the first call to _enable() to only update the pinmux
  */
 #define _HWMOD_NO_MPU_PORT			(1 << 0)
 #define _HWMOD_WAKEUP_ENABLED			(1 << 1)
 #define _HWMOD_SYSCONFIG_LOADED			(1 << 2)
+#define _HWMOD_SKIP_ENABLE			(1 << 3)
 
 /*
  * omap_hwmod._state definitions
-- 
1.7.7.3

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

* [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init
  2011-12-16 10:37 ` Paul Walmsley
@ 2011-12-16 11:03   ` Rajendra Nayak
  0 siblings, 0 replies; 4+ messages in thread
From: Rajendra Nayak @ 2011-12-16 11:03 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Paul,

On Friday 16 December 2011 04:07 PM, Paul Walmsley wrote:
> On Mon, 21 Nov 2011, Rajendra Nayak wrote:
>
>> >  An 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 hwmod 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. When the device/hwmod
>> >  is requested to be enabled (the first time) by its driver/user,
>> >  nothing except the mux-enable and a state change to '_HWMOD_STATE_ENABLED'
>> >  is needed. The mux data is board specific and is unavailable during
>> >  initial enable() of the device, done by the framework as part of
>> >  setup().
>> >
>> >  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.
>> >
>> >  Acked-by: Kevin Hilman<khilman@ti.com>
>> >  Acked-by: Benoit Cousson<b-cousson@ti.com>
>> >  Signed-off-by: Rajendra Nayak<rnayak@ti.com>
> I've tweaked this patch a little bit, mostly to avoid adding a new state,
> which increases the complexity of the rest of the code that handles the
> hwmod state machine.  The modified patch below just uses an internal flag.
> Please let me know if you have any comments.

Looks good to me.

thanks,
Rajendra

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

end of thread, other threads:[~2011-12-16 11:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-21 12:12 [PATCH v3] ARM: OMAP2+: hwmod: Add a new state to handle hwmods left enabled at init Rajendra Nayak
2011-11-21 18:38 ` Kevin Hilman
2011-12-16 10:37 ` Paul Walmsley
2011-12-16 11:03   ` Rajendra Nayak

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