From: Paul Walmsley <paul@pwsan.com>
To: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Cc: Benoit Cousson <b-cousson@ti.com>
Subject: [PATCH 03/22] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function
Date: Tue, 18 May 2010 20:18:41 -0600 [thread overview]
Message-ID: <20100519021840.19716.47328.stgit@localhost.localdomain> (raw)
In-Reply-To: <20100519021800.19716.8938.stgit@localhost.localdomain>
From: Benoit Cousson <b-cousson@ti.com>
The return of the omap4_cm_wait_module_ready function is checked
in order to avoid accessing the sysconfig register if the module is
not in the correct state.
In that case the _setup will exit without trying to reset
using sysconfig.
For the moment a warning is printed. A proper management of fclk
and module reset will have to be done in order to init correctly
the problematic IPs listed below.
<4>omap_hwmod: ivahd: cannot be enabled (3)
<4>omap_hwmod: iss: cannot be enabled (3)
<4>omap_hwmod: tesla: cannot be enabled (3)
<4>omap_hwmod: sdma: cannot be enabled (3)
<4>omap_hwmod: sl2: cannot be enabled (3)
<4>omap_hwmod: sad2d: cannot be enabled (3)
<4>omap_hwmod: ducati: cannot be enabled (3)
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/cm.h | 2 +-
arch/arm/mach-omap2/cm4xxx.c | 36 +++++++++++++++++++++++++++++-------
arch/arm/mach-omap2/omap_hwmod.c | 33 ++++++++++++++++++++-------------
3 files changed, 50 insertions(+), 21 deletions(-)
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h
index bbc69df..a02ca30 100644
--- a/arch/arm/mach-omap2/cm.h
+++ b/arch/arm/mach-omap2/cm.h
@@ -112,7 +112,7 @@ extern u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx);
extern int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id,
u8 idlest_shift);
-extern int omap4_cm_wait_module_ready(u32 prcm_mod, u8 prcm_dev_offs);
+extern int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg);
static inline u32 cm_set_mod_reg_bits(u32 bits, s16 module, s16 idx)
{
diff --git a/arch/arm/mach-omap2/cm4xxx.c b/arch/arm/mach-omap2/cm4xxx.c
index af32a45..b101091 100644
--- a/arch/arm/mach-omap2/cm4xxx.c
+++ b/arch/arm/mach-omap2/cm4xxx.c
@@ -21,19 +21,41 @@
#include <asm/atomic.h>
+#include <plat/common.h>
+
#include "cm.h"
#include "cm-regbits-44xx.h"
/**
- * omap4_cm_wait_idlest_ready - wait for a module to leave idle or standby
- * @prcm_mod: PRCM module offset (XXX example)
- * @prcm_dev_offs: PRCM device offset (e.g. MCASP XXX example)
+ * omap4_cm_wait_module_ready - wait for a module to be in 'func' state
+ * @clkctrl_reg: CLKCTRL module address
+ *
+ * Wait for the module IDLEST to be functional. If the idle state is in any
+ * the non functional state (trans, idle or disabled), module and thus the
+ * sysconfig cannot be accessed and will probably lead to an "imprecise
+ * external abort"
+ *
+ * Module idle state:
+ * 0x0 func: Module is fully functional, including OCP
+ * 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep
+ * abortion
+ * 0x2 idle: Module is in Idle mode (only OCP part). It is functional if
+ * using separate functional clock
+ * 0x3 disabled: Module is disabled and cannot be accessed
*
- * XXX document
+ * TODO: Need to handle module accessible in idle state
*/
-int omap4_cm_wait_idlest_ready(u32 prcm_mod, u8 prcm_dev_offs)
+int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg)
{
- /* FIXME: Add clock manager related code */
- return 0;
+ int i = 0;
+
+ if (!clkctrl_reg)
+ return 0;
+
+ omap_test_timeout(((__raw_readl(clkctrl_reg) &
+ OMAP4430_IDLEST_MASK) == 0),
+ MAX_MODULE_READY_TIME, i);
+
+ return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
}
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index e436dcb..4a134c4 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -819,11 +819,8 @@ static int _wait_target_ready(struct omap_hwmod *oh)
ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs,
oh->prcm.omap2.idlest_reg_id,
oh->prcm.omap2.idlest_idle_bit);
-#if 0
} else if (cpu_is_omap44xx()) {
- ret = omap4_cm_wait_module_ready(oh->prcm.omap4.module_offs,
- oh->prcm.omap4.device_offs);
-#endif
+ ret = omap4_cm_wait_module_ready(oh->prcm.omap4.clkctrl_reg);
} else {
BUG();
};
@@ -912,16 +909,21 @@ static int _enable(struct omap_hwmod *oh)
_add_initiator_dep(oh, mpu_oh);
_enable_clocks(oh);
- if (oh->class->sysc) {
- if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
- _update_sysc_cache(oh);
- _sysc_enable(oh);
- }
-
r = _wait_target_ready(oh);
- if (!r)
+ if (!r) {
oh->_state = _HWMOD_STATE_ENABLED;
+ /* Access the sysconfig only if the target is ready */
+ if (oh->class->sysc) {
+ if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
+ _update_sysc_cache(oh);
+ _sysc_enable(oh);
+ }
+ } else {
+ pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
+ oh->name, r);
+ }
+
return r;
}
@@ -999,7 +1001,7 @@ static int _shutdown(struct omap_hwmod *oh)
static int _setup(struct omap_hwmod *oh)
{
struct omap_hwmod_ocp_if *os;
- int i;
+ int i, r;
if (!oh)
return -EINVAL;
@@ -1023,7 +1025,12 @@ static int _setup(struct omap_hwmod *oh)
oh->_state = _HWMOD_STATE_INITIALIZED;
- _enable(oh);
+ r = _enable(oh);
+ if (r) {
+ pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n",
+ oh->name, oh->_state);
+ return 0;
+ }
if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
/*
WARNING: multiple messages have this Message-ID (diff)
From: paul@pwsan.com (Paul Walmsley)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 03/22] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function
Date: Tue, 18 May 2010 20:18:41 -0600 [thread overview]
Message-ID: <20100519021840.19716.47328.stgit@localhost.localdomain> (raw)
In-Reply-To: <20100519021800.19716.8938.stgit@localhost.localdomain>
From: Benoit Cousson <b-cousson@ti.com>
The return of the omap4_cm_wait_module_ready function is checked
in order to avoid accessing the sysconfig register if the module is
not in the correct state.
In that case the _setup will exit without trying to reset
using sysconfig.
For the moment a warning is printed. A proper management of fclk
and module reset will have to be done in order to init correctly
the problematic IPs listed below.
<4>omap_hwmod: ivahd: cannot be enabled (3)
<4>omap_hwmod: iss: cannot be enabled (3)
<4>omap_hwmod: tesla: cannot be enabled (3)
<4>omap_hwmod: sdma: cannot be enabled (3)
<4>omap_hwmod: sl2: cannot be enabled (3)
<4>omap_hwmod: sad2d: cannot be enabled (3)
<4>omap_hwmod: ducati: cannot be enabled (3)
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/cm.h | 2 +-
arch/arm/mach-omap2/cm4xxx.c | 36 +++++++++++++++++++++++++++++-------
arch/arm/mach-omap2/omap_hwmod.c | 33 ++++++++++++++++++++-------------
3 files changed, 50 insertions(+), 21 deletions(-)
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h
index bbc69df..a02ca30 100644
--- a/arch/arm/mach-omap2/cm.h
+++ b/arch/arm/mach-omap2/cm.h
@@ -112,7 +112,7 @@ extern u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx);
extern int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id,
u8 idlest_shift);
-extern int omap4_cm_wait_module_ready(u32 prcm_mod, u8 prcm_dev_offs);
+extern int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg);
static inline u32 cm_set_mod_reg_bits(u32 bits, s16 module, s16 idx)
{
diff --git a/arch/arm/mach-omap2/cm4xxx.c b/arch/arm/mach-omap2/cm4xxx.c
index af32a45..b101091 100644
--- a/arch/arm/mach-omap2/cm4xxx.c
+++ b/arch/arm/mach-omap2/cm4xxx.c
@@ -21,19 +21,41 @@
#include <asm/atomic.h>
+#include <plat/common.h>
+
#include "cm.h"
#include "cm-regbits-44xx.h"
/**
- * omap4_cm_wait_idlest_ready - wait for a module to leave idle or standby
- * @prcm_mod: PRCM module offset (XXX example)
- * @prcm_dev_offs: PRCM device offset (e.g. MCASP XXX example)
+ * omap4_cm_wait_module_ready - wait for a module to be in 'func' state
+ * @clkctrl_reg: CLKCTRL module address
+ *
+ * Wait for the module IDLEST to be functional. If the idle state is in any
+ * the non functional state (trans, idle or disabled), module and thus the
+ * sysconfig cannot be accessed and will probably lead to an "imprecise
+ * external abort"
+ *
+ * Module idle state:
+ * 0x0 func: Module is fully functional, including OCP
+ * 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep
+ * abortion
+ * 0x2 idle: Module is in Idle mode (only OCP part). It is functional if
+ * using separate functional clock
+ * 0x3 disabled: Module is disabled and cannot be accessed
*
- * XXX document
+ * TODO: Need to handle module accessible in idle state
*/
-int omap4_cm_wait_idlest_ready(u32 prcm_mod, u8 prcm_dev_offs)
+int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg)
{
- /* FIXME: Add clock manager related code */
- return 0;
+ int i = 0;
+
+ if (!clkctrl_reg)
+ return 0;
+
+ omap_test_timeout(((__raw_readl(clkctrl_reg) &
+ OMAP4430_IDLEST_MASK) == 0),
+ MAX_MODULE_READY_TIME, i);
+
+ return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
}
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index e436dcb..4a134c4 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -819,11 +819,8 @@ static int _wait_target_ready(struct omap_hwmod *oh)
ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs,
oh->prcm.omap2.idlest_reg_id,
oh->prcm.omap2.idlest_idle_bit);
-#if 0
} else if (cpu_is_omap44xx()) {
- ret = omap4_cm_wait_module_ready(oh->prcm.omap4.module_offs,
- oh->prcm.omap4.device_offs);
-#endif
+ ret = omap4_cm_wait_module_ready(oh->prcm.omap4.clkctrl_reg);
} else {
BUG();
};
@@ -912,16 +909,21 @@ static int _enable(struct omap_hwmod *oh)
_add_initiator_dep(oh, mpu_oh);
_enable_clocks(oh);
- if (oh->class->sysc) {
- if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
- _update_sysc_cache(oh);
- _sysc_enable(oh);
- }
-
r = _wait_target_ready(oh);
- if (!r)
+ if (!r) {
oh->_state = _HWMOD_STATE_ENABLED;
+ /* Access the sysconfig only if the target is ready */
+ if (oh->class->sysc) {
+ if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
+ _update_sysc_cache(oh);
+ _sysc_enable(oh);
+ }
+ } else {
+ pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
+ oh->name, r);
+ }
+
return r;
}
@@ -999,7 +1001,7 @@ static int _shutdown(struct omap_hwmod *oh)
static int _setup(struct omap_hwmod *oh)
{
struct omap_hwmod_ocp_if *os;
- int i;
+ int i, r;
if (!oh)
return -EINVAL;
@@ -1023,7 +1025,12 @@ static int _setup(struct omap_hwmod *oh)
oh->_state = _HWMOD_STATE_INITIALIZED;
- _enable(oh);
+ r = _enable(oh);
+ if (r) {
+ pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n",
+ oh->name, oh->_state);
+ return 0;
+ }
if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
/*
next prev parent reply other threads:[~2010-05-19 2:20 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-19 2:18 [PATCH 00/22] OMAP PRCM/clock/powerdomain/hwmod: remaining patches for 2.6.35 Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 01/22] OMAP4: hwmod: Replace module & device offsets by absolute clkctrl address Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 02/22] OMAP: CM: Move MAX_MODULE_READY_TIME to cm.h Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley [this message]
2010-05-19 2:18 ` [PATCH 03/22] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function Paul Walmsley
2010-05-19 2:18 ` [PATCH 04/22] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 05/22] OMAP: hwmod: Fix wrong pointer iteration in oh->slaves Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 06/22] OMAP: hwmod: Remove IS_ERR check with omap_clk_get_by_name return value Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 07/22] OMAP: hwmod: Replace WARN by pr_warning if clock lookup failed Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-21 10:00 ` Sergei Shtylyov
2010-05-21 10:00 ` Sergei Shtylyov
2010-05-21 10:16 ` Benoit Cousson
2010-05-21 10:16 ` Benoit Cousson
2010-05-19 2:18 ` [PATCH 08/22] OMAP: hwmod: Do not exit the iteration if one clock init failed Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 09/22] OMAP: hwmod: Rename hwmod name for the MPU Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 10/22] OMAP: hwmod: Replace WARN by pr_warning for clockdomain check Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-21 10:02 ` Sergei Shtylyov
2010-05-21 10:02 ` Sergei Shtylyov
2010-05-21 10:23 ` Sergei Shtylyov
2010-05-21 10:23 ` Sergei Shtylyov
2010-05-21 10:41 ` Benoit Cousson
2010-05-21 10:41 ` Benoit Cousson
2010-05-19 2:18 ` [PATCH 11/22] OMAP4: CM: Remove non-functional registers in ES1.0 Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 12/22] OMAP4: PRM: Remove MPU internal code name and apply PRCM naming convention Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 13/22] OMAP4: PRCM: Remove duplicate definition of base addresses Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 14/22] OMAP4: PRCM: Add offset defines for all PRM registers Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 15/22] OMAP4: PRCM: Add offset defines for all CM registers Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 16/22] OMAP4 clock: Support clk_set_parent Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 17/22] OMAP: timers: Fix clock source names for OMAP4 Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:18 ` [PATCH 18/22] OMAP4 powerdomain: Fix pwrsts flags for ALWAYS ON domains Paul Walmsley
2010-05-19 2:18 ` Paul Walmsley
2010-05-19 2:19 ` [PATCH 19/22] OMAP3 clock: add support for setting the divider for sys_clkout2 using clk_set_rate Paul Walmsley
2010-05-19 2:19 ` Paul Walmsley
2010-05-19 2:19 ` [PATCH 20/22] OMAP4 powerdomain: Support LOWPOWERSTATECHANGE for powerdomains Paul Walmsley
2010-05-19 2:19 ` Paul Walmsley
2010-05-19 2:19 ` [PATCH 21/22] OMAP powerdomain, hwmod, omap_device: add some credits Paul Walmsley
2010-05-19 2:19 ` Paul Walmsley
2010-05-19 2:19 ` [PATCH 22/22] OMAP2 clock: fix recursive spinlock attempt when CONFIG_CPU_FREQ=y Paul Walmsley
2010-05-19 2:19 ` Paul Walmsley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100519021840.19716.47328.stgit@localhost.localdomain \
--to=paul@pwsan.com \
--cc=b-cousson@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.