* [PATCH 01/10] OMAP4: hwmod: Replace module & device offsets by absolute clkctrl address
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 02/10] OMAP: CM: Move MAX_MODULE_READY_TIME to cm.h Benoit Cousson
` (9 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley, Rajendra Nayak
Accessing the clkctrl register using offset of module & device is hard
to do in OMAP4 due to the way the CM1, CM2, PRM and PRCM_MPU are located
in the address space. There is no common base address anymore for all the
CM registers.
The easiest way to handle that on OMAP4 is to provide the absolute address
of the XXX_CLKCTRL register per hwmod.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Rajendra Nayak <rnayak@ti.com>
---
arch/arm/plat-omap/include/plat/omap_hwmod.h | 8 +++-----
1 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 36d6ea5..4965bbe 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -327,14 +327,12 @@ struct omap_hwmod_omap2_prcm {
/**
* struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data
- * @module_offs: PRCM submodule offset from the start of the PRM/CM1/CM2
- * @device_offs: device register offset from @module_offs
+ * @clkctrl_reg: PRCM address of the clock control register
* @submodule_wkdep_bit: bit shift of the WKDEP range
*/
struct omap_hwmod_omap4_prcm {
- u32 module_offs;
- u16 device_offs;
- u8 submodule_wkdep_bit;
+ void __iomem *clkctrl_reg;
+ u8 submodule_wkdep_bit;
};
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 02/10] OMAP: CM: Move MAX_MODULE_READY_TIME to cm.h
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
2010-05-07 15:44 ` [PATCH 01/10] OMAP4: hwmod: Replace module & device offsets by absolute clkctrl address Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 03/10] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function Benoit Cousson
` (8 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
The maximum timeout to wait for the PRCM to request that a module
exit idle or reach functionnal state is common to OMAP2/3/4 SoCs,
so, move it to the chip family-common cm.h include file.
Reduce the timeout from 20 ms to 2 ms.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/cm.c | 3 ---
arch/arm/mach-omap2/cm.h | 9 +++++++++
arch/arm/mach-omap2/cm4xxx.c | 18 +-----------------
3 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/arch/arm/mach-omap2/cm.c b/arch/arm/mach-omap2/cm.c
index 58e4a1c..2d83565 100644
--- a/arch/arm/mach-omap2/cm.c
+++ b/arch/arm/mach-omap2/cm.c
@@ -27,9 +27,6 @@
#include "cm-regbits-24xx.h"
#include "cm-regbits-34xx.h"
-/* MAX_MODULE_READY_TIME: max milliseconds for module to leave idle */
-#define MAX_MODULE_READY_TIME 20000
-
static const u8 cm_idlest_offs[] = {
CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3
};
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h
index 94728b1..cd34036 100644
--- a/arch/arm/mach-omap2/cm.h
+++ b/arch/arm/mach-omap2/cm.h
@@ -143,4 +143,13 @@ static inline u32 cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
#define OMAP24XX_CM_IDLEST_VAL 0
#define OMAP34XX_CM_IDLEST_VAL 1
+/*
+ * MAX_MODULE_READY_TIME: max duration in microseconds to wait for the
+ * PRCM to request that a module exit the inactive state in the case of
+ * OMAP2 & 3.
+ * In the case of OMAP4 this is the max duration in microseconds for the
+ * module to reach the functionnal state from an inactive state.
+ */
+#define MAX_MODULE_READY_TIME 2000
+
#endif
diff --git a/arch/arm/mach-omap2/cm4xxx.c b/arch/arm/mach-omap2/cm4xxx.c
index 4af76bb..af32a45 100644
--- a/arch/arm/mach-omap2/cm4xxx.c
+++ b/arch/arm/mach-omap2/cm4xxx.c
@@ -22,23 +22,7 @@
#include <asm/atomic.h>
#include "cm.h"
-
-/* XXX move this to cm.h */
-/* MAX_MODULE_READY_TIME: max milliseconds for module to leave idle */
-#define MAX_MODULE_READY_TIME 20000
-
-/*
- * OMAP4_PRCM_CM_CLKCTRL_IDLEST_MASK: isolates the IDLEST field in the
- * CM_CLKCTRL register.
- */
-#define OMAP4_PRCM_CM_CLKCTRL_IDLEST_MASK (0x2 << 16)
-
-/*
- * OMAP4 prcm_mod u32 fields contain packed data: the CM ID in bit 16 and
- * the PRCM module offset address (from the CM module base) in bits 15-0.
- */
-#define OMAP4_PRCM_MOD_CM_ID_SHIFT 16
-#define OMAP4_PRCM_MOD_OFFS_MASK 0xffff
+#include "cm-regbits-44xx.h"
/**
* omap4_cm_wait_idlest_ready - wait for a module to leave idle or standby
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 03/10] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
2010-05-07 15:44 ` [PATCH 01/10] OMAP4: hwmod: Replace module & device offsets by absolute clkctrl address Benoit Cousson
2010-05-07 15:44 ` [PATCH 02/10] OMAP: CM: Move MAX_MODULE_READY_TIME to cm.h Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 04/10] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST Benoit Cousson
` (7 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
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>
Cc: 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 cd34036..b74ad98 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)) {
/*
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 04/10] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (2 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 03/10] OMAP4: hwmod & CM: Implement the omap4_cm_wait_module_ready function Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-26 21:34 ` Kevin Hilman
2010-05-07 15:44 ` [PATCH 05/10] OMAP: hwmod: Fix wrong pointer iteration in oh->slaves Benoit Cousson
` (6 subsequent siblings)
10 siblings, 1 reply; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
Some initiator modules in OMAP2 & 3 does not have IDLEST bit,
in that case we cannot detect the module readiness by
polling that bit and must exist the function immediately
assuming that the module is ready.
The previous flag was affected to the OCP interface. While it is
technically true that the idlest is related to the L4 slave
interface of the module, the PRCM status belong to the module.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 2 +-
arch/arm/plat-omap/include/plat/omap_hwmod.h | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 4a134c4..6459d07 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -808,7 +808,7 @@ static int _wait_target_ready(struct omap_hwmod *oh)
os = *oh->slaves + oh->_mpu_port_index;
- if (!(os->flags & OCPIF_HAS_IDLEST))
+ if (oh->flags & HWMOD_NO_IDLEST)
return 0;
/* XXX check module SIDLEMODE */
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 4965bbe..0eccc09 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -176,9 +176,8 @@ struct omap_hwmod_addr_space {
#define OCP_USER_SDMA (1 << 1)
/* omap_hwmod_ocp_if.flags bits */
-#define OCPIF_HAS_IDLEST (1 << 0)
-#define OCPIF_SWSUP_IDLE (1 << 1)
-#define OCPIF_CAN_BURST (1 << 2)
+#define OCPIF_SWSUP_IDLE (1 << 0)
+#define OCPIF_CAN_BURST (1 << 1)
/**
* struct omap_hwmod_ocp_if - OCP interface data
@@ -351,6 +350,8 @@ struct omap_hwmod_omap4_prcm {
* when module is enabled, rather than the default, which is to
* enable autoidle
* HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup
+ * HWMOD_NO_IDLEST : this module does not have idle status - this is the case
+ * only for few initiator modules on OMAP2 & 3.
*/
#define HWMOD_SWSUP_SIDLE (1 << 0)
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
@@ -358,6 +359,7 @@ struct omap_hwmod_omap4_prcm {
#define HWMOD_INIT_NO_IDLE (1 << 3)
#define HWMOD_NO_OCP_AUTOIDLE (1 << 4)
#define HWMOD_SET_DEFAULT_CLOCKACT (1 << 5)
+#define HWMOD_NO_IDLEST (1 << 6)
/*
* omap_hwmod._int_flags definitions
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH 04/10] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST
2010-05-07 15:44 ` [PATCH 04/10] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST Benoit Cousson
@ 2010-05-26 21:34 ` Kevin Hilman
0 siblings, 0 replies; 13+ messages in thread
From: Kevin Hilman @ 2010-05-26 21:34 UTC (permalink / raw)
To: Benoit Cousson; +Cc: linux-omap, Paul Walmsley
Benoit Cousson <b-cousson@ti.com> writes:
> Some initiator modules in OMAP2 & 3 does not have IDLEST bit,
> in that case we cannot detect the module readiness by
> polling that bit and must exist the function immediately
> assuming that the module is ready.
>
> The previous flag was affected to the OCP interface. While it is
> technically true that the idlest is related to the L4 slave
> interface of the module, the PRCM status belong to the module.
>
> Signed-off-by: Benoit Cousson <b-cousson@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
We had some discussions off-list on this patch... summarizing below.
> ---
> arch/arm/mach-omap2/omap_hwmod.c | 2 +-
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 8 +++++---
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index 4a134c4..6459d07 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -808,7 +808,7 @@ static int _wait_target_ready(struct omap_hwmod *oh)
>
> os = *oh->slaves + oh->_mpu_port_index;
>
> - if (!(os->flags & OCPIF_HAS_IDLEST))
> + if (oh->flags & HWMOD_NO_IDLEST)
> return 0;
This changes the default from assuming a module doesn't have an IDLEST
to assuming it does.
Because of this, we now get a bunch of failures in _enable() on
OMAP2/3 due to missing fields in the hwmods, in particular the members
of the 'struct omap_hwmod_omap2_prcm' are required to get correct
_wait_for_ready() behavior.
Therefore, when creating new hwmods, please be sure the fields of this
struct are filled out and correct.
Kevin
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 05/10] OMAP: hwmod: Fix wrong pointer iteration in oh->slaves
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (3 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 04/10] OMAP4: hwmod: Replace OCPIF_HAS_IDLEST by HWMOD_NO_IDLEST Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 06/10] OMAP: hwmod: Remove IS_ERR check with omap_clk_get_by_name return value Benoit Cousson
` (5 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
The iteration is currently done on the omap_hwmod_ocp_if pointer
and not on the table pointer that reference them.
It worked most of the time because the structure are contiguous in
memory.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 30 ++++++++++++++++--------------
1 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 6459d07..a280ccc 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -432,7 +432,6 @@ static int _init_main_clk(struct omap_hwmod *oh)
*/
static int _init_interface_clks(struct omap_hwmod *oh)
{
- struct omap_hwmod_ocp_if *os;
struct clk *c;
int i;
int ret = 0;
@@ -440,7 +439,9 @@ static int _init_interface_clks(struct omap_hwmod *oh)
if (oh->slaves_cnt == 0)
return 0;
- for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
+ for (i = 0; i < oh->slaves_cnt; i++) {
+ struct omap_hwmod_ocp_if *os = oh->slaves[i];
+
if (!os->clk)
continue;
@@ -490,7 +491,6 @@ static int _init_opt_clks(struct omap_hwmod *oh)
*/
static int _enable_clocks(struct omap_hwmod *oh)
{
- struct omap_hwmod_ocp_if *os;
int i;
pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
@@ -499,7 +499,8 @@ static int _enable_clocks(struct omap_hwmod *oh)
clk_enable(oh->_clk);
if (oh->slaves_cnt > 0) {
- for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
+ for (i = 0; i < oh->slaves_cnt; i++) {
+ struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (c && !IS_ERR(c) && (os->flags & OCPIF_SWSUP_IDLE))
@@ -520,7 +521,6 @@ static int _enable_clocks(struct omap_hwmod *oh)
*/
static int _disable_clocks(struct omap_hwmod *oh)
{
- struct omap_hwmod_ocp_if *os;
int i;
pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
@@ -529,7 +529,8 @@ static int _disable_clocks(struct omap_hwmod *oh)
clk_disable(oh->_clk);
if (oh->slaves_cnt > 0) {
- for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
+ for (i = 0; i < oh->slaves_cnt; i++) {
+ struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (c && !IS_ERR(c) && (os->flags & OCPIF_SWSUP_IDLE))
@@ -551,14 +552,15 @@ static int _disable_clocks(struct omap_hwmod *oh)
*/
static int _find_mpu_port_index(struct omap_hwmod *oh)
{
- struct omap_hwmod_ocp_if *os;
int i;
int found = 0;
if (!oh || oh->slaves_cnt == 0)
return -EINVAL;
- for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
+ for (i = 0; i < oh->slaves_cnt; i++) {
+ struct omap_hwmod_ocp_if *os = oh->slaves[i];
+
if (os->user & OCP_USER_MPU) {
found = 1;
break;
@@ -593,7 +595,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
if (!oh || oh->slaves_cnt == 0)
return NULL;
- os = *oh->slaves + index;
+ os = oh->slaves[index];
for (i = 0, mem = os->addr; i < os->addr_cnt; i++, mem++) {
if (mem->flags & ADDR_TYPE_RT) {
@@ -806,7 +808,7 @@ static int _wait_target_ready(struct omap_hwmod *oh)
if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
return 0;
- os = *oh->slaves + oh->_mpu_port_index;
+ os = oh->slaves[oh->_mpu_port_index];
if (oh->flags & HWMOD_NO_IDLEST)
return 0;
@@ -1000,7 +1002,6 @@ static int _shutdown(struct omap_hwmod *oh)
*/
static int _setup(struct omap_hwmod *oh)
{
- struct omap_hwmod_ocp_if *os;
int i, r;
if (!oh)
@@ -1008,7 +1009,8 @@ static int _setup(struct omap_hwmod *oh)
/* Set iclk autoidle mode */
if (oh->slaves_cnt > 0) {
- for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
+ for (i = 0; i < oh->slaves_cnt; i++) {
+ struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
if (!c || IS_ERR(c))
@@ -1438,7 +1440,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh)
ret = oh->mpu_irqs_cnt + oh->sdma_chs_cnt;
for (i = 0; i < oh->slaves_cnt; i++)
- ret += (*oh->slaves + i)->addr_cnt;
+ ret += oh->slaves[i]->addr_cnt;
return ret;
}
@@ -1479,7 +1481,7 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
for (i = 0; i < oh->slaves_cnt; i++) {
struct omap_hwmod_ocp_if *os;
- os = *oh->slaves + i;
+ os = oh->slaves[i];
for (j = 0; j < os->addr_cnt; j++) {
(res + r)->start = (os->addr + j)->pa_start;
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 06/10] OMAP: hwmod: Remove IS_ERR check with omap_clk_get_by_name return value
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (4 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 05/10] OMAP: hwmod: Fix wrong pointer iteration in oh->slaves Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 07/10] OMAP: hwmod: Replace WARN by pr_warning if clock lookup failed Benoit Cousson
` (4 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
The previous clock API was returning a standard linux error code in
case of failure. This is not the case anymore with the new
omap_clk_get_by_name API. A NULL value means that the clock node
does not exist.
Replace all the IS_ERR check by a !clk check.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 26 +++++++++++++-------------
1 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index a280ccc..a62920b 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -411,9 +411,9 @@ static int _init_main_clk(struct omap_hwmod *oh)
return 0;
c = omap_clk_get_by_name(oh->main_clk);
- WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get main_clk %s\n",
+ WARN(!c, "omap_hwmod: %s: cannot clk_get main_clk %s\n",
oh->name, oh->main_clk);
- if (IS_ERR(c))
+ if (!c)
ret = -EINVAL;
oh->_clk = c;
@@ -446,9 +446,9 @@ static int _init_interface_clks(struct omap_hwmod *oh)
continue;
c = omap_clk_get_by_name(os->clk);
- WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get "
- "interface_clk %s\n", oh->name, os->clk);
- if (IS_ERR(c))
+ WARN(!c, "omap_hwmod: %s: cannot clk_get interface_clk %s\n",
+ oh->name, os->clk);
+ if (!c)
ret = -EINVAL;
os->_clk = c;
}
@@ -472,9 +472,9 @@ static int _init_opt_clks(struct omap_hwmod *oh)
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
c = omap_clk_get_by_name(oc->clk);
- WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get opt_clk "
- "%s\n", oh->name, oc->clk);
- if (IS_ERR(c))
+ WARN(!c, "omap_hwmod: %s: cannot clk_get opt_clk %s\n",
+ oh->name, oc->clk);
+ if (!c)
ret = -EINVAL;
oc->_clk = c;
}
@@ -495,7 +495,7 @@ static int _enable_clocks(struct omap_hwmod *oh)
pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
- if (oh->_clk && !IS_ERR(oh->_clk))
+ if (oh->_clk)
clk_enable(oh->_clk);
if (oh->slaves_cnt > 0) {
@@ -503,7 +503,7 @@ static int _enable_clocks(struct omap_hwmod *oh)
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
- if (c && !IS_ERR(c) && (os->flags & OCPIF_SWSUP_IDLE))
+ if (c && (os->flags & OCPIF_SWSUP_IDLE))
clk_enable(c);
}
}
@@ -525,7 +525,7 @@ static int _disable_clocks(struct omap_hwmod *oh)
pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
- if (oh->_clk && !IS_ERR(oh->_clk))
+ if (oh->_clk)
clk_disable(oh->_clk);
if (oh->slaves_cnt > 0) {
@@ -533,7 +533,7 @@ static int _disable_clocks(struct omap_hwmod *oh)
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
- if (c && !IS_ERR(c) && (os->flags & OCPIF_SWSUP_IDLE))
+ if (c && (os->flags & OCPIF_SWSUP_IDLE))
clk_disable(c);
}
}
@@ -1013,7 +1013,7 @@ static int _setup(struct omap_hwmod *oh)
struct omap_hwmod_ocp_if *os = oh->slaves[i];
struct clk *c = os->_clk;
- if (!c || IS_ERR(c))
+ if (!c)
continue;
if (os->flags & OCPIF_SWSUP_IDLE) {
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 07/10] OMAP: hwmod: Replace WARN by pr_warning if clock lookup failed
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (5 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 06/10] OMAP: hwmod: Remove IS_ERR check with omap_clk_get_by_name return value Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 08/10] OMAP: hwmod: Do not exit the iteration if one clock init failed Benoit Cousson
` (3 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
The WARN is a little bit too verbose and is not providing
usefull information in that case.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index a62920b..5d3a3ea 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -411,9 +411,9 @@ static int _init_main_clk(struct omap_hwmod *oh)
return 0;
c = omap_clk_get_by_name(oh->main_clk);
- WARN(!c, "omap_hwmod: %s: cannot clk_get main_clk %s\n",
- oh->name, oh->main_clk);
if (!c)
+ pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n",
+ oh->name, oh->main_clk);
ret = -EINVAL;
oh->_clk = c;
@@ -446,9 +446,9 @@ static int _init_interface_clks(struct omap_hwmod *oh)
continue;
c = omap_clk_get_by_name(os->clk);
- WARN(!c, "omap_hwmod: %s: cannot clk_get interface_clk %s\n",
- oh->name, os->clk);
if (!c)
+ pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n",
+ oh->name, os->clk);
ret = -EINVAL;
os->_clk = c;
}
@@ -472,9 +472,9 @@ static int _init_opt_clks(struct omap_hwmod *oh)
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
c = omap_clk_get_by_name(oc->clk);
- WARN(!c, "omap_hwmod: %s: cannot clk_get opt_clk %s\n",
- oh->name, oc->clk);
if (!c)
+ pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n",
+ oh->name, oc->clk);
ret = -EINVAL;
oc->_clk = c;
}
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 08/10] OMAP: hwmod: Do not exit the iteration if one clock init failed
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (6 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 07/10] OMAP: hwmod: Replace WARN by pr_warning if clock lookup failed Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 09/10] OMAP: hwmod: Rename hwmod name for the MPU Benoit Cousson
` (2 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
During the _init_clocks phase, the iteration is stopped but the
status is still change from _HWMOD_STATE_REGISTERED to
_HWMOD_STATE_CLKS_INITED.
Since the _setup phase will be done nevertheless, it might be
better to keep initializing the others clocks nodes and just
keep the warning.
It is much easier to debug when a important number of clocks
name are wrong during the early debug phase of a new platform.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 5d3a3ea..b624ad6 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -783,9 +783,10 @@ static int _init_clocks(struct omap_hwmod *oh)
ret |= _init_interface_clks(oh);
ret |= _init_opt_clks(oh);
- oh->_state = _HWMOD_STATE_CLKS_INITED;
+ if (!ret)
+ oh->_state = _HWMOD_STATE_CLKS_INITED;
- return ret;
+ return 0;
}
/**
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 09/10] OMAP: hwmod: Rename hwmod name for the MPU
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (7 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 08/10] OMAP: hwmod: Do not exit the iteration if one clock init failed Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-07 15:44 ` [PATCH 10/10] OMAP: hwmod: Replace WARN by pr_warning for clockdomain check Benoit Cousson
2010-05-18 18:24 ` [PATCH 00/10] OMAP: HWMOD fixes and cleanup Paul Walmsley
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley, Rajendra Nayak
In the lastest OMAP4 hwmod data file, the _hwmod was removed
in order to save some memory space and because it does not
bring a lot.
The same cleanup will be have to done for other hwmods in
OMAP2 & 3 data files.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Rajendra Nayak <rnayak@ti.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 2 +-
arch/arm/mach-omap2/omap_hwmod_2420_data.c | 2 +-
arch/arm/mach-omap2/omap_hwmod_2430_data.c | 2 +-
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index b624ad6..b6031e4 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -58,7 +58,7 @@
#define MAX_MODULE_RESET_WAIT 10000
/* Name of the OMAP hwmod for the MPU */
-#define MPU_INITIATOR_NAME "mpu_hwmod"
+#define MPU_INITIATOR_NAME "mpu"
/* omap_hwmod_list contains all registered struct omap_hwmods */
static LIST_HEAD(omap_hwmod_list);
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index eb7ee24..e5530c5 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -125,7 +125,7 @@ static struct omap_hwmod_ocp_if *omap2420_mpu_masters[] = {
/* MPU */
static struct omap_hwmod omap2420_mpu_hwmod = {
- .name = "mpu_hwmod",
+ .name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "mpu_ck",
.masters = omap2420_mpu_masters,
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index 241bd82..0852d95 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -127,7 +127,7 @@ static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = {
/* MPU */
static struct omap_hwmod omap2430_mpu_hwmod = {
- .name = "mpu_hwmod",
+ .name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "mpu_ck",
.masters = omap2430_mpu_masters,
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index ed60840..39b0c0e 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -156,7 +156,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_mpu_masters[] = {
/* MPU */
static struct omap_hwmod omap3xxx_mpu_hwmod = {
- .name = "mpu_hwmod",
+ .name = "mpu",
.class = &mpu_hwmod_class,
.main_clk = "arm_fck",
.masters = omap3xxx_mpu_masters,
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH 10/10] OMAP: hwmod: Replace WARN by pr_warning for clockdomain check
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (8 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 09/10] OMAP: hwmod: Rename hwmod name for the MPU Benoit Cousson
@ 2010-05-07 15:44 ` Benoit Cousson
2010-05-18 18:24 ` [PATCH 00/10] OMAP: HWMOD fixes and cleanup Paul Walmsley
10 siblings, 0 replies; 13+ messages in thread
From: Benoit Cousson @ 2010-05-07 15:44 UTC (permalink / raw)
To: linux-omap; +Cc: Benoit Cousson, Paul Walmsley
Most of the clock nodes belong to a clock domain, but it is perfectly valid
to have clock without clock domain.
Root clocks for example does not belong to any clock domain.
Keep the warning but reduce the verbosity.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index b6031e4..2fff39f 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -404,21 +404,20 @@ static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
*/
static int _init_main_clk(struct omap_hwmod *oh)
{
- struct clk *c;
int ret = 0;
if (!oh->main_clk)
return 0;
- c = omap_clk_get_by_name(oh->main_clk);
- if (!c)
+ oh->_clk = omap_clk_get_by_name(oh->main_clk);
+ if (!oh->_clk)
pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n",
oh->name, oh->main_clk);
- ret = -EINVAL;
- oh->_clk = c;
+ return -EINVAL;
- WARN(!c->clkdm, "omap_hwmod: %s: missing clockdomain for %s.\n",
- oh->main_clk, c->name);
+ if (!oh->_clk->clkdm)
+ pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n",
+ oh->main_clk, oh->_clk->name);
return ret;
}
--
1.6.1.3
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH 00/10] OMAP: HWMOD fixes and cleanup
2010-05-07 15:44 [PATCH 00/10] OMAP: HWMOD fixes and cleanup Benoit Cousson
` (9 preceding siblings ...)
2010-05-07 15:44 ` [PATCH 10/10] OMAP: hwmod: Replace WARN by pr_warning for clockdomain check Benoit Cousson
@ 2010-05-18 18:24 ` Paul Walmsley
10 siblings, 0 replies; 13+ messages in thread
From: Paul Walmsley @ 2010-05-18 18:24 UTC (permalink / raw)
To: Benoit Cousson; +Cc: linux-omap
[-- Attachment #1: Type: TEXT/PLAIN, Size: 272 bytes --]
Hi Benoît,
On Fri, 7 May 2010, Benoit Cousson wrote:
> Here is the serie based on l-o master that prepare the OMAP4 HWMOD database
> introduction.
>
> It was only tested on OMAP4 GP device for the moment using PAB board.
Thanks, queued for 2.6.35.
- Paul
^ permalink raw reply [flat|nested] 13+ messages in thread