* [PATCH 0/3] OMAP clock and PM architecture fixes for 2.6.32-rc6
@ 2009-11-16 13:36 Paul Walmsley
2009-11-16 13:36 ` [PATCH 1/3] OMAP3 clock: Fix the DPLL freqsel computations Paul Walmsley
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Paul Walmsley @ 2009-11-16 13:36 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
this series contains fixes for some clock and PM architecture components
for the 2.6.32-rc series.
- Paul
---
Paul Walmsley (1):
OMAP clock/hwmod: fix off-by-one errors
Rajendra Nayak (1):
OMAP3 clock: Fix the DPLL freqsel computations
Tero Kristo (1):
OMAP3: Clock: Fixed dpll3_m2x2 rate calculation
arch/arm/mach-omap2/clock34xx.c | 2 +-
arch/arm/mach-omap2/clock34xx.h | 4 ++--
arch/arm/mach-omap2/cm.c | 2 +-
arch/arm/mach-omap2/omap_hwmod.c | 12 +++++-------
arch/arm/mach-omap2/prcm.c | 4 ++--
5 files changed, 11 insertions(+), 13 deletions(-)
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH 1/3] OMAP3 clock: Fix the DPLL freqsel computations 2009-11-16 13:36 [PATCH 0/3] OMAP clock and PM architecture fixes for 2.6.32-rc6 Paul Walmsley @ 2009-11-16 13:36 ` Paul Walmsley 2009-11-16 13:36 ` [PATCH 2/3] OMAP3: Clock: Fixed dpll3_m2x2 rate calculation Paul Walmsley 2009-11-16 13:36 ` [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors Paul Walmsley 2 siblings, 0 replies; 10+ messages in thread From: Paul Walmsley @ 2009-11-16 13:36 UTC (permalink / raw) To: linux-arm-kernel From: Rajendra Nayak <rnayak@ti.com> Fix the freqsel value computation. Use n instead of (n+1) The formula in the TRM uses a zero-based N, hence the (n+1); however at this point in the clock34xx.c code, N is one-based. Hayati Bayrakdar <h-bayrakdar@ti.com> and Nishanth Menon <nm@ti.com> helped track down this bug. Signed-off-by: Rajendra Nayak <rnayak@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com> [paul at pwsan.com: modified commit message] Cc: Hayati Bayrakdar <h-bayrakdar@ti.com> Cc: Nishanth Menon <nm@ti.com> --- arch/arm/mach-omap2/clock34xx.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index c258f87..225c1a7 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c @@ -473,7 +473,7 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n) unsigned long fint; u16 f = 0; - fint = clk->dpll_data->clk_ref->rate / (n + 1); + fint = clk->dpll_data->clk_ref->rate / n; pr_debug("clock: fint is %lu\n", fint); ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] OMAP3: Clock: Fixed dpll3_m2x2 rate calculation 2009-11-16 13:36 [PATCH 0/3] OMAP clock and PM architecture fixes for 2.6.32-rc6 Paul Walmsley 2009-11-16 13:36 ` [PATCH 1/3] OMAP3 clock: Fix the DPLL freqsel computations Paul Walmsley @ 2009-11-16 13:36 ` Paul Walmsley 2009-11-16 13:36 ` [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors Paul Walmsley 2 siblings, 0 replies; 10+ messages in thread From: Paul Walmsley @ 2009-11-16 13:36 UTC (permalink / raw) To: linux-arm-kernel From: Tero Kristo <tero.kristo@nokia.com> Current calculation does not take into account any changes to M2 divisor, and thus when we change VDD2 OPP, dpll3_m2x2 rate does not change. Fixed by re-routing dpll3_m2x2 parent to dpll3_m2. Signed-off-by: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Paul Walmsley <paul@pwsan.com> --- arch/arm/mach-omap2/clock34xx.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h index a1b3de7..8fe1bcb 100644 --- a/arch/arm/mach-omap2/clock34xx.h +++ b/arch/arm/mach-omap2/clock34xx.h @@ -489,9 +489,9 @@ static struct clk core_ck = { static struct clk dpll3_m2x2_ck = { .name = "dpll3_m2x2_ck", .ops = &clkops_null, - .parent = &dpll3_x2_ck, + .parent = &dpll3_m2_ck, .clkdm_name = "dpll3_clkdm", - .recalc = &followparent_recalc, + .recalc = &omap3_clkoutx2_recalc, }; /* The PWRDN bit is apparently only available on 3430ES2 and above */ ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-16 13:36 [PATCH 0/3] OMAP clock and PM architecture fixes for 2.6.32-rc6 Paul Walmsley 2009-11-16 13:36 ` [PATCH 1/3] OMAP3 clock: Fix the DPLL freqsel computations Paul Walmsley 2009-11-16 13:36 ` [PATCH 2/3] OMAP3: Clock: Fixed dpll3_m2x2 rate calculation Paul Walmsley @ 2009-11-16 13:36 ` Paul Walmsley 2009-11-16 14:08 ` Russell King - ARM Linux 2 siblings, 1 reply; 10+ messages in thread From: Paul Walmsley @ 2009-11-16 13:36 UTC (permalink / raw) To: linux-arm-kernel Fix loop bailout off-by-one bugs reported by Juha Lepp?nen <juha_motorsportcom@luukku.com>. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Juha Lepp?nen <juha_motorsportcom@luukku.com> --- arch/arm/mach-omap2/cm.c | 2 +- arch/arm/mach-omap2/omap_hwmod.c | 12 +++++------- arch/arm/mach-omap2/prcm.c | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/arch/arm/mach-omap2/cm.c b/arch/arm/mach-omap2/cm.c index 8eb2dab..0766e52 100644 --- a/arch/arm/mach-omap2/cm.c +++ b/arch/arm/mach-omap2/cm.c @@ -65,6 +65,6 @@ int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) (i++ < MAX_MODULE_READY_TIME)) udelay(1); - return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; + 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 633b216..a4a9518 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -759,14 +759,12 @@ static int _reset(struct omap_hwmod *oh) _write_sysconfig(v, oh); c = 0; - while (c < MAX_MODULE_RESET_WAIT && - !(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & - SYSS_RESETDONE_MASK)) { + while (!(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & + SYSS_RESETDONE_MASK) && + (c++ < MAX_MODULE_RESET_WAIT)) udelay(1); - c++; - } - if (c == MAX_MODULE_RESET_WAIT) + if (c > MAX_MODULE_RESET_WAIT) WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", oh->name, MAX_MODULE_RESET_WAIT); else @@ -777,7 +775,7 @@ static int _reset(struct omap_hwmod *oh) * _wait_target_ready() or _reset() */ - return (c == MAX_MODULE_RESET_WAIT) ? -ETIMEDOUT : 0; + return (c > MAX_MODULE_RESET_WAIT) ? -ETIMEDOUT : 0; } /** diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 029d376..d486709 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -251,14 +251,14 @@ int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) (i++ < MAX_MODULE_ENABLE_WAIT)) udelay(1); - if (i < MAX_MODULE_ENABLE_WAIT) + if (i <= MAX_MODULE_ENABLE_WAIT) pr_debug("cm: Module associated with clock %s ready after %d " "loops\n", name, i); else pr_err("cm: Module associated with clock %s didn't enable in " "%d tries\n", name, MAX_MODULE_ENABLE_WAIT); - return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0; + return (i <= MAX_MODULE_ENABLE_WAIT) ? 1 : 0; }; void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-16 13:36 ` [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors Paul Walmsley @ 2009-11-16 14:08 ` Russell King - ARM Linux 2009-11-17 17:39 ` Paul Walmsley 0 siblings, 1 reply; 10+ messages in thread From: Russell King - ARM Linux @ 2009-11-16 14:08 UTC (permalink / raw) To: linux-arm-kernel On Mon, Nov 16, 2009 at 06:36:55AM -0700, Paul Walmsley wrote: > Fix loop bailout off-by-one bugs reported by Juha Lepp?nen > <juha_motorsportcom@luukku.com>. I'm not sure the new code is any easier to read than the old code. And what with some checks post-loop being <= and others being >, it's a recipe for cut'n'paste errors happening. > diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c > index 633b216..a4a9518 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -759,14 +759,12 @@ static int _reset(struct omap_hwmod *oh) > _write_sysconfig(v, oh); > > c = 0; > - while (c < MAX_MODULE_RESET_WAIT && > - !(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & > - SYSS_RESETDONE_MASK)) { > + while (!(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & > + SYSS_RESETDONE_MASK) && > + (c++ < MAX_MODULE_RESET_WAIT)) > udelay(1); > - c++; > - } > > - if (c == MAX_MODULE_RESET_WAIT) > + if (c > MAX_MODULE_RESET_WAIT) > WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", > oh->name, MAX_MODULE_RESET_WAIT); > else How about: for (c = 0; c <= MAX_MODULE_RESET_WAIT; c++) { if (omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & SYSS_RESETDONE_MASK) { pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, c); return 0; } } WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", oh->name, c - 1); return -ETIMEDOUT; ? Even better would be to turn this into a helper much like wait_event(), which would stop silly mistakes happening. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-16 14:08 ` Russell King - ARM Linux @ 2009-11-17 17:39 ` Paul Walmsley 2009-11-17 17:50 ` Pandita, Vikram 0 siblings, 1 reply; 10+ messages in thread From: Paul Walmsley @ 2009-11-17 17:39 UTC (permalink / raw) To: linux-arm-kernel Hi Russell, On Mon, 16 Nov 2009, Russell King - ARM Linux wrote: > On Mon, Nov 16, 2009 at 06:36:55AM -0700, Paul Walmsley wrote: > > Fix loop bailout off-by-one bugs reported by Juha Lepp?nen > > <juha_motorsportcom@luukku.com>. > > I'm not sure the new code is any easier to read than the old code. > And what with some checks post-loop being <= and others being >, it's > a recipe for cut'n'paste errors happening. ... > How about: > > for (c = 0; c <= MAX_MODULE_RESET_WAIT; c++) { > if (omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & > SYSS_RESETDONE_MASK) { > pr_debug("omap_hwmod: %s: reset in %d usec\n", > oh->name, c); > return 0; > } > } > > WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", > oh->name, c - 1); > return -ETIMEDOUT; > > ? > > Even better would be to turn this into a helper much like wait_event(), > which would stop silly mistakes happening. Agreed. How about this? arch/arm/plat-omap/include/plat/common.h probably isn't the right place for it, since it's not OMAP-specific... - Paul >From 972b3bbf2c210086b862aedb35587484bcefe998 Mon Sep 17 00:00:00 2001 From: Paul Walmsley <paul@pwsan.com> Date: Mon, 16 Nov 2009 06:13:15 -0700 Subject: [PATCH] OMAP clock/hwmod: fix off-by-one errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix loop bailout off-by-one bugs reported by Juha Lepp?nen <juha_motorsportcom@luukku.com>. This second version incorporates comments from Russell King <rmk+kernel@arm.linux.org.uk>. A new macro, 'omap_test_timeout', has been created, with cleaner code, and existing code has been converted to use it. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Juha Lepp?nen <juha_motorsportcom@luukku.com> Cc: Russell King <rmk+kernel@arm.linux.org.uk> --- arch/arm/mach-omap2/cm.c | 7 ++++--- arch/arm/mach-omap2/omap_hwmod.c | 13 +++++-------- arch/arm/mach-omap2/prcm.c | 5 ++--- arch/arm/plat-omap/include/plat/common.h | 20 ++++++++++++++++++++ 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/arch/arm/mach-omap2/cm.c b/arch/arm/mach-omap2/cm.c index 8eb2dab..58e4a1c 100644 --- a/arch/arm/mach-omap2/cm.c +++ b/arch/arm/mach-omap2/cm.c @@ -21,6 +21,8 @@ #include <asm/atomic.h> +#include <plat/common.h> + #include "cm.h" #include "cm-regbits-24xx.h" #include "cm-regbits-34xx.h" @@ -61,9 +63,8 @@ int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) mask = 1 << idlest_shift; /* XXX should be OMAP2 CM */ - while (((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) != ena) && - (i++ < MAX_MODULE_READY_TIME)) - udelay(1); + omap_test_timeout(((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) == ena), + 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 633b216..7aaf5f1 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -45,6 +45,7 @@ #include <linux/mutex.h> #include <linux/bootmem.h> +#include <plat/common.h> #include <plat/cpu.h> #include <plat/clockdomain.h> #include <plat/powerdomain.h> @@ -736,7 +737,7 @@ static int _wait_target_ready(struct omap_hwmod *oh) static int _reset(struct omap_hwmod *oh) { u32 r, v; - int c; + int c = 0; if (!oh->sysconfig || !(oh->sysconfig->sysc_flags & SYSC_HAS_SOFTRESET) || @@ -758,13 +759,9 @@ static int _reset(struct omap_hwmod *oh) return r; _write_sysconfig(v, oh); - c = 0; - while (c < MAX_MODULE_RESET_WAIT && - !(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & - SYSS_RESETDONE_MASK)) { - udelay(1); - c++; - } + omap_test_timeout((omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & + SYSS_RESETDONE_MASK), + MAX_MODULE_RESET_WAIT, c); if (c == MAX_MODULE_RESET_WAIT) WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 029d376..7acd03d 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -247,9 +247,8 @@ int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) BUG(); /* Wait for lock */ - while (((__raw_readl(reg) & mask) != ena) && - (i++ < MAX_MODULE_ENABLE_WAIT)) - udelay(1); + omap_test_timeout(((__raw_readl(reg) & mask) == ena), + MAX_MODULE_ENABLE_WAIT, i); if (i < MAX_MODULE_ENABLE_WAIT) pr_debug("cm: Module associated with clock %s ready after %d " diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 064f173..e977967 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h @@ -71,4 +71,24 @@ void omap2_set_globals_sdrc(struct omap_globals *); void omap2_set_globals_control(struct omap_globals *); void omap2_set_globals_prcm(struct omap_globals *); +/** + * omap_test_timeout - busy-loop, testing a condition + * @cond: condition to test until it evaluates to true + * @timeout: maximum number of microseconds in the timeout + * @index: loop index (integer) + * + * Loop waiting for @cond to become true or until@least @timeout + * microseconds have passed. To use, define some integer @index in the + * calling code. After running, if @index == @timeout, then the loop has + * timed out. + */ +#define omap_test_timeout(cond, timeout, index) \ +({ \ + for (index = 0; index < timeout; index++) { \ + if (cond) \ + break; \ + udelay(1); \ + } \ +}) + #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ -- 1.6.5.GIT ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-17 17:39 ` Paul Walmsley @ 2009-11-17 17:50 ` Pandita, Vikram 2009-11-17 22:24 ` Tony Lindgren 0 siblings, 1 reply; 10+ messages in thread From: Pandita, Vikram @ 2009-11-17 17:50 UTC (permalink / raw) To: linux-arm-kernel Paul >-----Original Message----- From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner at vger.kernel.org] On Behalf Of Paul >Walmsley >Sent: Tuesday, November 17, 2009 11:39 AM >To: Russell King - ARM Linux >Cc: linux-arm-kernel at lists.infradead.org; Juha Lepp?nen; linux-omap at vger.kernel.org >Subject: Re: [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors <snip> > >+/** >+ * omap_test_timeout - busy-loop, testing a condition >+ * @cond: condition to test until it evaluates to true >+ * @timeout: maximum number of microseconds in the timeout >+ * @index: loop index (integer) >+ * >+ * Loop waiting for @cond to become true or until at least @timeout >+ * microseconds have passed. To use, define some integer @index in the >+ * calling code. After running, if @index == @timeout, then the loop has >+ * timed out. >+ */ >+#define omap_test_timeout(cond, timeout, index) \ >+({ \ >+ for (index = 0; index < timeout; index++) { \ >+ if (cond) \ >+ break; \ >+ udelay(1); \ >+ } \ >+}) >+ There is a similar kind of function implemented in USB host, that returns -ETIMEDOUT Which makes more sense for failure case. Maybe such a generic function for all omaps is needed. Refer: drivers/usb/host/ehci-hcd.c static int handshake (struct ehci_hcd *ehci, void __iomem *ptr, u32 mask, u32 done, int usec) { u32 result; do { result = ehci_readl(ehci, ptr); if (result == ~(u32)0) /* card removed */ return -ENODEV; result &= mask; if (result == done) return 0; udelay (1); usec--; } while (usec > 0); return -ETIMEDOUT; } > #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ >-- >1.6.5.GIT ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-17 17:50 ` Pandita, Vikram @ 2009-11-17 22:24 ` Tony Lindgren 2009-11-18 18:47 ` Tony Lindgren 0 siblings, 1 reply; 10+ messages in thread From: Tony Lindgren @ 2009-11-17 22:24 UTC (permalink / raw) To: linux-arm-kernel * Pandita, Vikram <vikram.pandita@ti.com> [091117 09:50]: > Paul > > >-----Original Message----- > >From: linux-omap-owner at vger.kernel.org [mailto:linux-omap-owner at vger.kernel.org] On Behalf Of Paul > >Walmsley > >Sent: Tuesday, November 17, 2009 11:39 AM > >To: Russell King - ARM Linux > >Cc: linux-arm-kernel at lists.infradead.org; Juha Lepp?nen; linux-omap at vger.kernel.org > >Subject: Re: [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors > <snip> > > > >+/** > >+ * omap_test_timeout - busy-loop, testing a condition > >+ * @cond: condition to test until it evaluates to true > >+ * @timeout: maximum number of microseconds in the timeout > >+ * @index: loop index (integer) > >+ * > >+ * Loop waiting for @cond to become true or until at least @timeout > >+ * microseconds have passed. To use, define some integer @index in the > >+ * calling code. After running, if @index == @timeout, then the loop has > >+ * timed out. > >+ */ > >+#define omap_test_timeout(cond, timeout, index) \ > >+({ \ > >+ for (index = 0; index < timeout; index++) { \ > >+ if (cond) \ > >+ break; \ > >+ udelay(1); \ > >+ } \ > >+}) > >+ > > There is a similar kind of function implemented in USB host, that returns -ETIMEDOUT > Which makes more sense for failure case. > > Maybe such a generic function for all omaps is needed. > > Refer: > drivers/usb/host/ehci-hcd.c > static int handshake (struct ehci_hcd *ehci, void __iomem *ptr, > u32 mask, u32 done, int usec) > { > u32 result; > > do { > result = ehci_readl(ehci, ptr); > if (result == ~(u32)0) /* card removed */ > return -ENODEV; > result &= mask; > if (result == done) > return 0; > udelay (1); > usec--; > } while (usec > 0); > return -ETIMEDOUT; > } > > > > #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ Well we need to stick to minimal changes if we plan to send this in as a fix. Anything more complex we should do the next merge window. Tony ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-17 22:24 ` Tony Lindgren @ 2009-11-18 18:47 ` Tony Lindgren 2009-11-18 19:11 ` Paul Walmsley 0 siblings, 1 reply; 10+ messages in thread From: Tony Lindgren @ 2009-11-18 18:47 UTC (permalink / raw) To: linux-arm-kernel * Tony Lindgren <tony@atomide.com> [091117 14:24]: > * Pandita, Vikram <vikram.pandita@ti.com> [091117 09:50]: > > Paul > > > > >-----Original Message----- > > >From: linux-omap-owner at vger.kernel.org [mailto:linux-omap-owner at vger.kernel.org] On Behalf Of Paul > > >Walmsley > > >Sent: Tuesday, November 17, 2009 11:39 AM > > >To: Russell King - ARM Linux > > >Cc: linux-arm-kernel at lists.infradead.org; Juha Lepp?nen; linux-omap at vger.kernel.org > > >Subject: Re: [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors > > <snip> > > > > > >+/** > > >+ * omap_test_timeout - busy-loop, testing a condition > > >+ * @cond: condition to test until it evaluates to true > > >+ * @timeout: maximum number of microseconds in the timeout > > >+ * @index: loop index (integer) > > >+ * > > >+ * Loop waiting for @cond to become true or until at least @timeout > > >+ * microseconds have passed. To use, define some integer @index in the > > >+ * calling code. After running, if @index == @timeout, then the loop has > > >+ * timed out. > > >+ */ > > >+#define omap_test_timeout(cond, timeout, index) \ > > >+({ \ > > >+ for (index = 0; index < timeout; index++) { \ > > >+ if (cond) \ > > >+ break; \ > > >+ udelay(1); \ > > >+ } \ > > >+}) > > >+ > > > > There is a similar kind of function implemented in USB host, that returns -ETIMEDOUT > > Which makes more sense for failure case. > > > > Maybe such a generic function for all omaps is needed. > > > > Refer: > > drivers/usb/host/ehci-hcd.c > > static int handshake (struct ehci_hcd *ehci, void __iomem *ptr, > > u32 mask, u32 done, int usec) > > { > > u32 result; > > > > do { > > result = ehci_readl(ehci, ptr); > > if (result == ~(u32)0) /* card removed */ > > return -ENODEV; > > result &= mask; > > if (result == done) > > return 0; > > udelay (1); > > usec--; > > } while (usec > 0); > > return -ETIMEDOUT; > > } > > > > > > > #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ > > Well we need to stick to minimal changes if we plan to send this in as a fix. > Anything more complex we should do the next merge window. To me it sounds like this can wait until the merge window, so not adding to omap-fixes for now. Regards, Tony ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors 2009-11-18 18:47 ` Tony Lindgren @ 2009-11-18 19:11 ` Paul Walmsley 0 siblings, 0 replies; 10+ messages in thread From: Paul Walmsley @ 2009-11-18 19:11 UTC (permalink / raw) To: linux-arm-kernel On Wed, 18 Nov 2009, Tony Lindgren wrote: > To me it sounds like this can wait until the merge window, > so not adding to omap-fixes for now. Indeed, there's no rush on this one, so let's set it up for 2.6.33. I'll keep that macro in plat/system.h unless you or Russell have a better suggestion. It might be worth looking at the rest of the Linux codebase to see if there are other potential users; maybe someone might be willing to pick up a "kernel-janitor" task for this? Vikram, I agree with your comment. Maybe someone can send a patch to clean up ehci-hcd.c and any other users of the same idiom to use this macro for 2.6.33? Looks like also plat-omap/mailbox.c:__mbox_msg_send() and mach-omap2/powerdomain.c:pwrdm_wait_transition() would be good candidates for this, under arch/arm/*omap*. - Paul ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-11-18 19:11 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-11-16 13:36 [PATCH 0/3] OMAP clock and PM architecture fixes for 2.6.32-rc6 Paul Walmsley 2009-11-16 13:36 ` [PATCH 1/3] OMAP3 clock: Fix the DPLL freqsel computations Paul Walmsley 2009-11-16 13:36 ` [PATCH 2/3] OMAP3: Clock: Fixed dpll3_m2x2 rate calculation Paul Walmsley 2009-11-16 13:36 ` [PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors Paul Walmsley 2009-11-16 14:08 ` Russell King - ARM Linux 2009-11-17 17:39 ` Paul Walmsley 2009-11-17 17:50 ` Pandita, Vikram 2009-11-17 22:24 ` Tony Lindgren 2009-11-18 18:47 ` Tony Lindgren 2009-11-18 19:11 ` Paul Walmsley
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).