>>-----Original Message----- >>From: Gopinath, Thara >>Sent: Sunday, December 06, 2009 4:55 PM >>To: linux-omap@xxxxxxxxxxxxxxx >>Cc: Gopinath, Thara; Paul Walmsley >>Subject: [PATCH] OMAP3: hwmod: Adding flag to prevent caching of sysconfig register. >> >>In the current implementation the sysconfig value is read into >> _sysc_cache once and an actual update to the sysconfig register >>happens only if the new value paased is differnt from the one in _sysc_cache. >>_sysc_cache is updated only if _HWMOD_SYSCONFIG_LOADED is not set. >>This can lead to the follwing issue if off mode is enabled in modules >>which employs "always-retore" mechanism of context save and restore. >> >> a. The module sets the sysconfig register through omap_device_enable. >> Here _sysc_cache is updated with the value written to the sysconfig >> register and left. >> b. The power domain containig the module enters off mode and the >> module context is lost. >> c. The module in use becomes active and calls omap_device_enable to >> enable itself. Here a read of sysconfig register does not happen >> as _HWMOD_SYSCONFIG_LOADED flag is set. The value to be written >> to the sysconfig register will be same as the one written in step a. >> Since _sysc_cache reflects the previous written value an update >> of the sysconfig register does not happen. >>This means in modules which employs "always-restore" mechanism >>after off , the sysconfig regsiters will never get updated. >> >>This patch introduces a flag SYSC_NO_CACHE which if set ensures that the >>sysconfig register is always read into _sysc_cache before an update is >>attempted. >> >>This flags need to be set only by modules which does not do a context save >>but re-initializes the registers every time the module is accessed. This >>includes modules like i2c, smartreflex etc. >> >>Signed-off-by: Thara Gopinath <thara@xxxxxx> >>Cc: Paul Walmsley <paul@xxxxxxxxx> >>--- >>This patch depends on >> http://patchwork.kernel.org/patch/63383/ >> http://patchwork.kernel.org/patch/65140/ >> >> arch/arm/mach-omap2/omap_hwmod.c | 3 ++- >> arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 + >> 2 files changed, 3 insertions(+), 1 deletions(-) >> >>diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c >>index 3edc387..786bf2e 100644 >>--- a/arch/arm/mach-omap2/omap_hwmod.c >>+++ b/arch/arm/mach-omap2/omap_hwmod.c >>@@ -93,7 +93,8 @@ static int _update_sysc_cache(struct omap_hwmod *oh) >> >> oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); >> >>- oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; >>+ if (!(oh->sysconfig->sysc_flags & SYSC_NO_CACHE)) >>+ oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; >> >> return 0; >> } >>diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat- >>omap/include/plat/omap_hwmod.h >>index 1f83495..a3298ca 100644 >>--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h >>+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h >>@@ -228,6 +228,7 @@ struct omap_hwmod_ocp_if { >> #define SYSC_HAS_MIDLEMODE (1 << 6) >> #define SYSS_MISSING (1 << 7) >> #define SYSC_CHANGE_CLKACT_OFFSET (1 << 8) >>+#define SYSC_NO_CACHE (1 << 9) >> >> /* omap_hwmod_sysconfig.clockact flags */ >> #define CLOCKACT_TEST_BOTH 0x0 >>-- Hi Paul,Kevin.. Does this patch look ok? >>1.5.4.7 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html