[PATCH] OMAP3: hwmod: Adding flag to prevent caching of sysconfig register.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
-- 
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

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux