Kishon Vijay Abraham I <kishon@xxxxxx> writes: > 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. Since driver should not be using hwmod directly, how is this API going to be used? Will this only be called from arch/arm/mach-omap2/mcbsp.c? > 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> Subject should contain prefix like 'OMAP: hwmod: ...' Kevin > --- > 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); -- 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