* [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value @ 2010-01-19 9:20 Ranjith Lohithakshan 2010-02-05 20:16 ` Paul Walmsley 0 siblings, 1 reply; 4+ messages in thread From: Ranjith Lohithakshan @ 2010-01-19 9:20 UTC (permalink / raw) To: linux-omap; +Cc: paul, ranjithl Current implementation defines clock idle state indicators based on the cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide manner. This patch extends the find_idlest() function in clkops to pass back the idle state indicator for that clock, thus allowing idle state indicators to be defined on a per clock basis if required. This is specifically needed on AM35xx devices as the new IPSS clocks indicates the idle status (0 is idle, 1 is ready) in a way just opposite to how its handled in OMAP3 (0 is ready, 1 is idle). Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com> --- arch/arm/mach-omap2/clock.c | 22 ++++++++++++++++++---- arch/arm/mach-omap2/clock.h | 2 +- arch/arm/mach-omap2/clock2xxx.c | 7 +++++-- arch/arm/mach-omap2/clock34xx.c | 15 ++++++++++++--- arch/arm/mach-omap2/cm.h | 3 +++ arch/arm/mach-omap2/prcm.c | 14 +++++--------- arch/arm/plat-omap/include/plat/clock.h | 2 +- arch/arm/plat-omap/include/plat/prcm.h | 2 +- 8 files changed, 46 insertions(+), 21 deletions(-) diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 759c72a..b5cc7b7 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -351,7 +351,8 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk * @clk: struct clk * to find IDLEST info for * @idlest_reg: void __iomem ** to return the CM_IDLEST va in - * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in + * @idlest_bit: u8 * to return the CM_IDLEST bit shift in + * @idlest_val: u8 * to return the idle status indicator * * Return the CM_IDLEST register address and bit shift corresponding * to the module that "owns" this clock. This default code assumes @@ -361,13 +362,25 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, * CM_IDLEST2). This is not true for all modules. No return value. */ void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = clk->enable_bit; + + /* + * 24xx uses 0 to indicate not ready, and 1 to indicate ready. + * 34xx reverses this, just to keep us on our toes + */ + if (cpu_is_omap24xx()) + *idlest_val = OMAP24XX_CM_IDLEST_VAL; + else if (cpu_is_omap34xx()) + *idlest_val = OMAP34XX_CM_IDLEST_VAL; + else + BUG(); + } /** @@ -384,6 +397,7 @@ static void omap2_module_wait_ready(struct clk *clk) { void __iomem *companion_reg, *idlest_reg; u8 other_bit, idlest_bit; + u8 idlest_val; /* Not all modules have multiple clocks that their IDLEST depends on */ if (clk->ops->find_companion) { @@ -392,9 +406,9 @@ static void omap2_module_wait_ready(struct clk *clk) return; } - clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit); + clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); - omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name); + omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, clk->name); } int omap2_dflt_clk_enable(struct clk *clk) diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 93c48df..c159503 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -90,7 +90,7 @@ void omap2_dflt_clk_disable(struct clk *clk); void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, u8 *other_bit); void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit); + u8 *idlest_bit, u8 *idlest_val); extern u8 cpu_mask; diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index 5420356..9dd5265 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c @@ -72,6 +72,7 @@ void __iomem *prcm_clksrc_ctrl; * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function @@ -80,10 +81,12 @@ void __iomem *prcm_clksrc_ctrl; */ static void omap2430_clk_i2chs_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { *idlest_reg = OMAP_CM_REGADDR(CORE_MOD, CM_IDLEST); *idlest_bit = clk->enable_bit; + *idlest_val = OMAP24XX_CM_IDLEST_VAL; } /* 2430 I2CHS has non-standard IDLEST register */ @@ -176,7 +179,7 @@ static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), status_mask, - clk->name); + OMAP24XX_CM_IDLEST_VAL, clk->name); /* * REVISIT: Should we return an error code if omap2_wait_clock_ready() diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index d4217b9..97752e4 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c @@ -59,6 +59,7 @@ struct clk *sdrc_ick_p, *arm_fck_p; * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift * from the CM_{I,F}CLKEN bit. Pass back the correct info via @@ -66,13 +67,15 @@ struct clk *sdrc_ick_p, *arm_fck_p; */ static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_ssi_wait = { @@ -87,6 +90,7 @@ const struct clkops clkops_omap3430es2_ssi_wait = { * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * Some OMAP modules on OMAP3 ES2+ chips have both initiator and * target IDLEST bits. For our purposes, we are concerned with the @@ -97,7 +101,8 @@ const struct clkops clkops_omap3430es2_ssi_wait = { */ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; @@ -105,6 +110,7 @@ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, *idlest_reg = (__force void __iomem *)r; /* USBHOST_IDLE has same shift */ *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_dss_usbhost_wait = { @@ -119,6 +125,7 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via @@ -126,13 +133,15 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { */ static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_hsotgusb_wait = { diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 90a4086..be77daa 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -138,5 +138,8 @@ static inline u32 cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx) /* CM_IDLEST_GFX */ #define OMAP_ST_GFX (1 << 0) +/* CM_IDLEST indicator */ +#define OMAP24XX_CM_IDLEST_VAL 0 +#define OMAP34XX_CM_IDLEST_VAL 1 #endif diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 3ea8177..3552df7 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -220,26 +220,22 @@ u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness * @reg: physical address of module IDLEST register * @mask: value to mask against to determine if the module is active + * @idlest: idle state indicator (0 or 1) for the clock * @name: name of the clock (for printk) * * Returns 1 if the module indicated readiness in time, or 0 if it * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. */ -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, + const char *name) { int i = 0; int ena = 0; - /* - * 24xx uses 0 to indicate not ready, and 1 to indicate ready. - * 34xx reverses this, just to keep us on our toes - */ - if (cpu_is_omap24xx()) - ena = mask; - else if (cpu_is_omap34xx()) + if (idlest) ena = 0; else - BUG(); + ena = mask; /* Wait for lock */ omap_test_timeout(((__raw_readl(reg) & mask) == ena), diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index 94fe2a0..df5072d 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h @@ -22,7 +22,7 @@ struct clockdomain; struct clkops { int (*enable)(struct clk *); void (*disable)(struct clk *); - void (*find_idlest)(struct clk *, void __iomem **, u8 *); + void (*find_idlest)(struct clk *, void __iomem **, u8 *, u8 *); void (*find_companion)(struct clk *, void __iomem **, u8 *); }; diff --git a/arch/arm/plat-omap/include/plat/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h index e63e94e..329c05a 100644 --- a/arch/arm/plat-omap/include/plat/prcm.h +++ b/arch/arm/plat-omap/include/plat/prcm.h @@ -25,7 +25,7 @@ u32 omap_prcm_get_reset_sources(void); void omap_prcm_arch_reset(char mode); -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, const char *name); #define START_PADCONF_SAVE 0x2 #define PADCONF_SAVE_DONE 0x1 -- 1.6.2.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value 2010-01-19 9:20 [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value Ranjith Lohithakshan @ 2010-02-05 20:16 ` Paul Walmsley 2010-02-08 17:34 ` Ranjith Lohithakshan 0 siblings, 1 reply; 4+ messages in thread From: Paul Walmsley @ 2010-02-05 20:16 UTC (permalink / raw) To: Ranjith Lohithakshan; +Cc: linux-omap Hi Ranjith, On Tue, 19 Jan 2010, Ranjith Lohithakshan wrote: > Current implementation defines clock idle state indicators based on the > cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide > manner. This patch extends the find_idlest() function in clkops to pass > back the idle state indicator for that clock, thus allowing idle state > indicators to be defined on a per clock basis if required. > > This is specifically needed on AM35xx devices as the new IPSS clocks > indicates the idle status (0 is idle, 1 is ready) in a way just > opposite to how its handled in OMAP3 (0 is ready, 1 is idle). > > Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com> I had to make some changes to this patch for it to apply after the recent clock split patches. Could you please check this patch and make sure it is okay? - Paul From: Ranjith Lohithakshan <ranjithl@ti.com> Date: Fri, 5 Feb 2010 12:55:21 -0700 Subject: [PATCH] OMAP2/3 clock: Extend find_idlest() to pass back idle state value Current implementation defines clock idle state indicators based on the cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide manner. This patch extends the find_idlest() function in clkops to pass back the idle state indicator for that clock, thus allowing idle state indicators to be defined on a per clock basis if required. This is specifically needed on AM35xx devices as the new IPSS clocks indicates the idle status (0 is idle, 1 is ready) in a way just opposite to how its handled in OMAP3 (0 is ready, 1 is idle). Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com> [paul@pwsan.com: updated to apply after commit 98c45457 et seq.] Signed-off-by: Paul Walmsley <paul@pwsan.com> --- arch/arm/mach-omap2/clkt2xxx_apll.c | 2 +- arch/arm/mach-omap2/clock.c | 25 ++++++++++++++++++++----- arch/arm/mach-omap2/clock.h | 2 +- arch/arm/mach-omap2/clock2xxx.c | 5 ++++- arch/arm/mach-omap2/clock34xx.c | 15 ++++++++++++--- arch/arm/mach-omap2/cm.h | 3 +++ arch/arm/mach-omap2/prcm.c | 14 +++++--------- arch/arm/plat-omap/include/plat/clock.h | 6 ++++-- arch/arm/plat-omap/include/plat/prcm.h | 3 ++- 9 files changed, 52 insertions(+), 23 deletions(-) diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c index fc32ff8..d5b8b2b 100644 --- a/arch/arm/mach-omap2/clkt2xxx_apll.c +++ b/arch/arm/mach-omap2/clkt2xxx_apll.c @@ -57,7 +57,7 @@ static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), status_mask, - clk->name); + OMAP24XX_CM_IDLEST_VAL, clk->name); /* * REVISIT: Should we return an error code if omap2_wait_clock_ready() diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 999b91e..3bb3292 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -57,7 +57,7 @@ u8 cpu_mask; static void _omap2_module_wait_ready(struct clk *clk) { void __iomem *companion_reg, *idlest_reg; - u8 other_bit, idlest_bit; + u8 other_bit, idlest_bit, idlest_val; /* Not all modules have multiple clocks that their IDLEST depends on */ if (clk->ops->find_companion) { @@ -66,9 +66,10 @@ static void _omap2_module_wait_ready(struct clk *clk) return; } - clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit); + clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); - omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name); + omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, + clk->name); } /* Enables clock without considering parent dependencies or use count @@ -175,7 +176,8 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk * @clk: struct clk * to find IDLEST info for * @idlest_reg: void __iomem ** to return the CM_IDLEST va in - * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in + * @idlest_bit: u8 * to return the CM_IDLEST bit shift in + * @idlest_val: u8 * to return the idle status indicator * * Return the CM_IDLEST register address and bit shift corresponding * to the module that "owns" this clock. This default code assumes @@ -185,13 +187,26 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, * CM_IDLEST2). This is not true for all modules. No return value. */ void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = clk->enable_bit; + + /* + * 24xx uses 0 to indicate not ready, and 1 to indicate ready. + * 34xx reverses this, just to keep us on our toes + * AM35xx uses both, depending on the module. + */ + if (cpu_is_omap24xx()) + *idlest_val = OMAP24XX_CM_IDLEST_VAL; + else if (cpu_is_omap34xx()) + *idlest_val = OMAP34XX_CM_IDLEST_VAL; + else + BUG(); + } int omap2_dflt_clk_enable(struct clk *clk) diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 7bc344b..c500a5f 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -88,7 +88,7 @@ void omap2_dflt_clk_disable(struct clk *clk); void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, u8 *other_bit); void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit); + u8 *idlest_bit, u8 *idlest_val); void omap2xxx_clk_commit(struct clk *clk); extern u8 cpu_mask; diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index a48b01a..94fb8a6 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c @@ -42,6 +42,7 @@ struct clk *vclk, *sclk, *dclk; * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function @@ -50,10 +51,12 @@ struct clk *vclk, *sclk, *dclk; */ static void omap2430_clk_i2chs_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { *idlest_reg = OMAP_CM_REGADDR(CORE_MOD, CM_IDLEST); *idlest_bit = clk->enable_bit; + *idlest_val = OMAP24XX_CM_IDLEST_VAL; } #else diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index 1f1b5a6..d339d2b 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c @@ -47,6 +47,7 @@ struct clk *sdrc_ick_p, *arm_fck_p; * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift * from the CM_{I,F}CLKEN bit. Pass back the correct info via @@ -54,13 +55,15 @@ struct clk *sdrc_ick_p, *arm_fck_p; */ static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_ssi_wait = { @@ -75,6 +78,7 @@ const struct clkops clkops_omap3430es2_ssi_wait = { * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * Some OMAP modules on OMAP3 ES2+ chips have both initiator and * target IDLEST bits. For our purposes, we are concerned with the @@ -85,7 +89,8 @@ const struct clkops clkops_omap3430es2_ssi_wait = { */ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; @@ -93,6 +98,7 @@ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, *idlest_reg = (__force void __iomem *)r; /* USBHOST_IDLE has same shift */ *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_dss_usbhost_wait = { @@ -107,6 +113,7 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { * @clk: struct clk * being enabled * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator * * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via @@ -114,13 +121,15 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { */ static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, void __iomem **idlest_reg, - u8 *idlest_bit) + u8 *idlest_bit, + u8 *idlest_val) { u32 r; r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); *idlest_reg = (__force void __iomem *)r; *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; + *idlest_val = OMAP34XX_CM_IDLEST_VAL; } const struct clkops clkops_omap3430es2_hsotgusb_wait = { diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 4e4ac8c..94728b1 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -139,5 +139,8 @@ static inline u32 cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx) /* CM_IDLEST_GFX */ #define OMAP_ST_GFX (1 << 0) +/* CM_IDLEST indicator */ +#define OMAP24XX_CM_IDLEST_VAL 0 +#define OMAP34XX_CM_IDLEST_VAL 1 #endif diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index e8e121a..0f87fdc 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -242,26 +242,22 @@ u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness * @reg: physical address of module IDLEST register * @mask: value to mask against to determine if the module is active + * @idlest: idle state indicator (0 or 1) for the clock * @name: name of the clock (for printk) * * Returns 1 if the module indicated readiness in time, or 0 if it * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. */ -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, + const char *name) { int i = 0; int ena = 0; - /* - * 24xx uses 0 to indicate not ready, and 1 to indicate ready. - * 34xx reverses this, just to keep us on our toes - */ - if (cpu_is_omap24xx()) - ena = mask; - else if (cpu_is_omap34xx()) + if (idlest) ena = 0; else - BUG(); + ena = mask; /* Wait for lock */ omap_test_timeout(((__raw_readl(reg) & mask) == ena), diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index e413132..9042dab 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h @@ -22,8 +22,10 @@ struct clockdomain; struct clkops { int (*enable)(struct clk *); void (*disable)(struct clk *); - void (*find_idlest)(struct clk *, void __iomem **, u8 *); - void (*find_companion)(struct clk *, void __iomem **, u8 *); + void (*find_idlest)(struct clk *, void __iomem **, + u8 *, u8 *); + void (*find_companion)(struct clk *, void __iomem **, + u8 *); }; #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ diff --git a/arch/arm/plat-omap/include/plat/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h index 66938a9..d6a0e27 100644 --- a/arch/arm/plat-omap/include/plat/prcm.h +++ b/arch/arm/plat-omap/include/plat/prcm.h @@ -25,7 +25,8 @@ u32 omap_prcm_get_reset_sources(void); void omap_prcm_arch_reset(char mode); -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, + const char *name); #define START_PADCONF_SAVE 0x2 #define PADCONF_SAVE_DONE 0x1 -- 1.6.6.rc2.5.g49666 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value 2010-02-05 20:16 ` Paul Walmsley @ 2010-02-08 17:34 ` Ranjith Lohithakshan 2010-02-08 17:37 ` Paul Walmsley 0 siblings, 1 reply; 4+ messages in thread From: Ranjith Lohithakshan @ 2010-02-08 17:34 UTC (permalink / raw) To: Paul Walmsley; +Cc: linux-omap@vger.kernel.org Hi Paul, On Sat, 06-Feb-10 1:46 AM +0530, Paul Walmsley wrote: > Hi Ranjith, > > On Tue, 19 Jan 2010, Ranjith Lohithakshan wrote: > >> Current implementation defines clock idle state indicators based on the >> cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide >> manner. This patch extends the find_idlest() function in clkops to pass >> back the idle state indicator for that clock, thus allowing idle state >> indicators to be defined on a per clock basis if required. >> >> This is specifically needed on AM35xx devices as the new IPSS clocks >> indicates the idle status (0 is idle, 1 is ready) in a way just >> opposite to how its handled in OMAP3 (0 is ready, 1 is idle). >> >> Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com> > > I had to make some changes to this patch for it to apply after the recent > clock split patches. Could you please check this patch and make sure it > is okay? It looks good to me. I have verified these latest changes on AM3517 EVM - Ranjith > - Paul > > > From: Ranjith Lohithakshan <ranjithl@ti.com> > Date: Fri, 5 Feb 2010 12:55:21 -0700 > Subject: [PATCH] OMAP2/3 clock: Extend find_idlest() to pass back idle state value > > Current implementation defines clock idle state indicators based on the > cpu information (cpu_is_omap24xx() or cpu_is_omap34xx()) in a system wide > manner. This patch extends the find_idlest() function in clkops to pass > back the idle state indicator for that clock, thus allowing idle state > indicators to be defined on a per clock basis if required. > > This is specifically needed on AM35xx devices as the new IPSS clocks > indicates the idle status (0 is idle, 1 is ready) in a way just > opposite to how its handled in OMAP3 (0 is ready, 1 is idle). > > Signed-off-by: Ranjith Lohithakshan <ranjithl@ti.com> > [paul@pwsan.com: updated to apply after commit 98c45457 et seq.] > Signed-off-by: Paul Walmsley <paul@pwsan.com> > --- > arch/arm/mach-omap2/clkt2xxx_apll.c | 2 +- > arch/arm/mach-omap2/clock.c | 25 ++++++++++++++++++++----- > arch/arm/mach-omap2/clock.h | 2 +- > arch/arm/mach-omap2/clock2xxx.c | 5 ++++- > arch/arm/mach-omap2/clock34xx.c | 15 ++++++++++++--- > arch/arm/mach-omap2/cm.h | 3 +++ > arch/arm/mach-omap2/prcm.c | 14 +++++--------- > arch/arm/plat-omap/include/plat/clock.h | 6 ++++-- > arch/arm/plat-omap/include/plat/prcm.h | 3 ++- > 9 files changed, 52 insertions(+), 23 deletions(-) > > diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c > index fc32ff8..d5b8b2b 100644 > --- a/arch/arm/mach-omap2/clkt2xxx_apll.c > +++ b/arch/arm/mach-omap2/clkt2xxx_apll.c > @@ -57,7 +57,7 @@ static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) > cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); > > omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), status_mask, > - clk->name); > + OMAP24XX_CM_IDLEST_VAL, clk->name); > > /* > * REVISIT: Should we return an error code if omap2_wait_clock_ready() > diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c > index 999b91e..3bb3292 100644 > --- a/arch/arm/mach-omap2/clock.c > +++ b/arch/arm/mach-omap2/clock.c > @@ -57,7 +57,7 @@ u8 cpu_mask; > static void _omap2_module_wait_ready(struct clk *clk) > { > void __iomem *companion_reg, *idlest_reg; > - u8 other_bit, idlest_bit; > + u8 other_bit, idlest_bit, idlest_val; > > /* Not all modules have multiple clocks that their IDLEST depends on */ > if (clk->ops->find_companion) { > @@ -66,9 +66,10 @@ static void _omap2_module_wait_ready(struct clk *clk) > return; > } > > - clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit); > + clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); > > - omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name); > + omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, > + clk->name); > } > > /* Enables clock without considering parent dependencies or use count > @@ -175,7 +176,8 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, > * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk > * @clk: struct clk * to find IDLEST info for > * @idlest_reg: void __iomem ** to return the CM_IDLEST va in > - * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in > + * @idlest_bit: u8 * to return the CM_IDLEST bit shift in > + * @idlest_val: u8 * to return the idle status indicator > * > * Return the CM_IDLEST register address and bit shift corresponding > * to the module that "owns" this clock. This default code assumes > @@ -185,13 +187,26 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, > * CM_IDLEST2). This is not true for all modules. No return value. > */ > void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, > - u8 *idlest_bit) > + u8 *idlest_bit, u8 *idlest_val) > { > u32 r; > > r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); > *idlest_reg = (__force void __iomem *)r; > *idlest_bit = clk->enable_bit; > + > + /* > + * 24xx uses 0 to indicate not ready, and 1 to indicate ready. > + * 34xx reverses this, just to keep us on our toes > + * AM35xx uses both, depending on the module. > + */ > + if (cpu_is_omap24xx()) > + *idlest_val = OMAP24XX_CM_IDLEST_VAL; > + else if (cpu_is_omap34xx()) > + *idlest_val = OMAP34XX_CM_IDLEST_VAL; > + else > + BUG(); > + > } > > int omap2_dflt_clk_enable(struct clk *clk) > diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h > index 7bc344b..c500a5f 100644 > --- a/arch/arm/mach-omap2/clock.h > +++ b/arch/arm/mach-omap2/clock.h > @@ -88,7 +88,7 @@ void omap2_dflt_clk_disable(struct clk *clk); > void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, > u8 *other_bit); > void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, > - u8 *idlest_bit); > + u8 *idlest_bit, u8 *idlest_val); > void omap2xxx_clk_commit(struct clk *clk); > > extern u8 cpu_mask; > diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c > index a48b01a..94fb8a6 100644 > --- a/arch/arm/mach-omap2/clock2xxx.c > +++ b/arch/arm/mach-omap2/clock2xxx.c > @@ -42,6 +42,7 @@ struct clk *vclk, *sclk, *dclk; > * @clk: struct clk * being enabled > * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into > * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into > + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator > * > * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the > * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function > @@ -50,10 +51,12 @@ struct clk *vclk, *sclk, *dclk; > */ > static void omap2430_clk_i2chs_find_idlest(struct clk *clk, > void __iomem **idlest_reg, > - u8 *idlest_bit) > + u8 *idlest_bit, > + u8 *idlest_val) > { > *idlest_reg = OMAP_CM_REGADDR(CORE_MOD, CM_IDLEST); > *idlest_bit = clk->enable_bit; > + *idlest_val = OMAP24XX_CM_IDLEST_VAL; > } > > #else > diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c > index 1f1b5a6..d339d2b 100644 > --- a/arch/arm/mach-omap2/clock34xx.c > +++ b/arch/arm/mach-omap2/clock34xx.c > @@ -47,6 +47,7 @@ struct clk *sdrc_ick_p, *arm_fck_p; > * @clk: struct clk * being enabled > * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into > * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into > + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator > * > * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift > * from the CM_{I,F}CLKEN bit. Pass back the correct info via > @@ -54,13 +55,15 @@ struct clk *sdrc_ick_p, *arm_fck_p; > */ > static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, > void __iomem **idlest_reg, > - u8 *idlest_bit) > + u8 *idlest_bit, > + u8 *idlest_val) > { > u32 r; > > r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); > *idlest_reg = (__force void __iomem *)r; > *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; > + *idlest_val = OMAP34XX_CM_IDLEST_VAL; > } > > const struct clkops clkops_omap3430es2_ssi_wait = { > @@ -75,6 +78,7 @@ const struct clkops clkops_omap3430es2_ssi_wait = { > * @clk: struct clk * being enabled > * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into > * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into > + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator > * > * Some OMAP modules on OMAP3 ES2+ chips have both initiator and > * target IDLEST bits. For our purposes, we are concerned with the > @@ -85,7 +89,8 @@ const struct clkops clkops_omap3430es2_ssi_wait = { > */ > static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, > void __iomem **idlest_reg, > - u8 *idlest_bit) > + u8 *idlest_bit, > + u8 *idlest_val) > { > u32 r; > > @@ -93,6 +98,7 @@ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, > *idlest_reg = (__force void __iomem *)r; > /* USBHOST_IDLE has same shift */ > *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; > + *idlest_val = OMAP34XX_CM_IDLEST_VAL; > } > > const struct clkops clkops_omap3430es2_dss_usbhost_wait = { > @@ -107,6 +113,7 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { > * @clk: struct clk * being enabled > * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into > * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into > + * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator > * > * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different > * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via > @@ -114,13 +121,15 @@ const struct clkops clkops_omap3430es2_dss_usbhost_wait = { > */ > static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, > void __iomem **idlest_reg, > - u8 *idlest_bit) > + u8 *idlest_bit, > + u8 *idlest_val) > { > u32 r; > > r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); > *idlest_reg = (__force void __iomem *)r; > *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; > + *idlest_val = OMAP34XX_CM_IDLEST_VAL; > } > > const struct clkops clkops_omap3430es2_hsotgusb_wait = { > diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h > index 4e4ac8c..94728b1 100644 > --- a/arch/arm/mach-omap2/cm.h > +++ b/arch/arm/mach-omap2/cm.h > @@ -139,5 +139,8 @@ static inline u32 cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx) > /* CM_IDLEST_GFX */ > #define OMAP_ST_GFX (1 << 0) > > +/* CM_IDLEST indicator */ > +#define OMAP24XX_CM_IDLEST_VAL 0 > +#define OMAP34XX_CM_IDLEST_VAL 1 > > #endif > diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c > index e8e121a..0f87fdc 100644 > --- a/arch/arm/mach-omap2/prcm.c > +++ b/arch/arm/mach-omap2/prcm.c > @@ -242,26 +242,22 @@ u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) > * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness > * @reg: physical address of module IDLEST register > * @mask: value to mask against to determine if the module is active > + * @idlest: idle state indicator (0 or 1) for the clock > * @name: name of the clock (for printk) > * > * Returns 1 if the module indicated readiness in time, or 0 if it > * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. > */ > -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) > +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, > + const char *name) > { > int i = 0; > int ena = 0; > > - /* > - * 24xx uses 0 to indicate not ready, and 1 to indicate ready. > - * 34xx reverses this, just to keep us on our toes > - */ > - if (cpu_is_omap24xx()) > - ena = mask; > - else if (cpu_is_omap34xx()) > + if (idlest) > ena = 0; > else > - BUG(); > + ena = mask; > > /* Wait for lock */ > omap_test_timeout(((__raw_readl(reg) & mask) == ena), > diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h > index e413132..9042dab 100644 > --- a/arch/arm/plat-omap/include/plat/clock.h > +++ b/arch/arm/plat-omap/include/plat/clock.h > @@ -22,8 +22,10 @@ struct clockdomain; > struct clkops { > int (*enable)(struct clk *); > void (*disable)(struct clk *); > - void (*find_idlest)(struct clk *, void __iomem **, u8 *); > - void (*find_companion)(struct clk *, void __iomem **, u8 *); > + void (*find_idlest)(struct clk *, void __iomem **, > + u8 *, u8 *); > + void (*find_companion)(struct clk *, void __iomem **, > + u8 *); > }; > > #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ > diff --git a/arch/arm/plat-omap/include/plat/prcm.h b/arch/arm/plat-omap/include/plat/prcm.h > index 66938a9..d6a0e27 100644 > --- a/arch/arm/plat-omap/include/plat/prcm.h > +++ b/arch/arm/plat-omap/include/plat/prcm.h > @@ -25,7 +25,8 @@ > > u32 omap_prcm_get_reset_sources(void); > void omap_prcm_arch_reset(char mode); > -int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); > +int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest, > + const char *name); > > #define START_PADCONF_SAVE 0x2 > #define PADCONF_SAVE_DONE 0x1 > -- > 1.6.6.rc2.5.g49666 > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value 2010-02-08 17:34 ` Ranjith Lohithakshan @ 2010-02-08 17:37 ` Paul Walmsley 0 siblings, 0 replies; 4+ messages in thread From: Paul Walmsley @ 2010-02-08 17:37 UTC (permalink / raw) To: Ranjith Lohithakshan; +Cc: linux-omap@vger.kernel.org Hi Ranjith, On Mon, 8 Feb 2010, Ranjith Lohithakshan wrote: > On Sat, 06-Feb-10 1:46 AM +0530, Paul Walmsley wrote: > > > > I had to make some changes to this patch for it to apply after the recent > > clock split patches. Could you please check this patch and make sure it > > is okay? > > It looks good to me. I have verified these latest changes on AM3517 EVM Thanks, queued for 2.6.34. - Paul ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-02-08 17:37 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-01-19 9:20 [PATCH 1/2] OMAP2/3 clock: Extend find_idlest() to pass back idle state value Ranjith Lohithakshan 2010-02-05 20:16 ` Paul Walmsley 2010-02-08 17:34 ` Ranjith Lohithakshan 2010-02-08 17:37 ` Paul Walmsley
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.