Though the sysconfig register values shouldn't be modified directly by the driver, MCBSP should be considered a special case where sysconfig registers need to be modified dynamically by the driver. For e.g MCBSP 2 and 3 in OMAP3 has sidetone feature which requires autoidle to be disabled before starting the sidetone. This patch creates a new API that forms a wrapper to _set_module_autoidle() to modify the AUTOIDLE bit. Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx> Signed-off-by: Charulatha V <charu@xxxxxx> Signed-off-by: Shubhrajyoti D <shubhrajyoti@xxxxxx> Cc: Paul Walmsley<paul@xxxxxxxxx> Cc: Benoit Cousson<b-cousson@xxxxxx> Cc: Partha Basak <p-basak2@xxxxxx> --- arch/arm/mach-omap2/omap_hwmod.c | 29 ++++++++++++++++++++++++++ arch/arm/plat-omap/include/plat/omap_hwmod.h | 1 + 2 files changed, 30 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 9bd99ad..0d38404 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -969,6 +969,35 @@ int _omap_hwmod_idle(struct omap_hwmod *oh) } /** + * omap_hwmod_set_module_autoidle - set the hwmod's OCP slave autoidle + * @oh: struct omap_hwmod * + * @autoidle: desired AUTOIDLE bitfield value (0 or 1) + * + * Sets the IP block's OCP slave autoidle in hardware, and updates our + * local copy. Intended to be used by drivers that have some erratum + * that requires direct manipulation of the AUTOIDLE bits. Returns + * -EINVAL if @oh is null, or passes along the return value from + * _set_module_autoidle(). + */ +int omap_hwmod_set_module_autoidle(struct omap_hwmod *oh, u8 autoidle) +{ + u32 v; + int retval = 0; + + if (!oh) + return -EINVAL; + + v = oh->_sysc_cache; + + retval = _set_module_autoidle(oh, autoidle, &v); + + if (!retval) + _write_sysconfig(v, oh); + + return retval; +} + +/** * _shutdown - shutdown an omap_hwmod * @oh: struct omap_hwmod * * diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 6adbb63..7042b86 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h @@ -526,6 +526,7 @@ int omap_hwmod_hardreset_deassert(struct omap_hwmod *oh, const char *name); int omap_hwmod_hardreset_state(struct omap_hwmod *oh, const char *name); int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); +int omap_hwmod_set_module_autoidle(struct omap_hwmod *oh, u8 autoidle) int omap_hwmod_reset(struct omap_hwmod *oh); void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); -- 1.7.0.4 -- 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