> -----Original Message----- > From: linux-omap-owner@xxxxxxxxxxxxxxx [mailto:linux-omap- > owner@xxxxxxxxxxxxxxx] On Behalf Of Paul Walmsley > Sent: Thursday, June 24, 2010 10:39 AM > To: Kevin Hilman > Cc: linux-omap@xxxxxxxxxxxxxxx > Subject: Re: [PATCH 06/13] OMAP: hwmod: add non-locking versions of enable > and idle functions > > Hi Kevin > > On Wed, 23 Jun 2010, Kevin Hilman wrote: > > > Some hwmods may need to be idled/enabled in atomic context, so > > non-locking versions of these functions are required. > > > > Most users should not need these and usage of theses should be > > controlled to understand why access is being done in atomic context. > > For this reason, the non-locking functions are only exposed at the > > hwmod level and not at the omap-device level. > > > > The use-case that led to the need for the non-locking versions is > > hwmods that are enabled/idled from within the core idle/suspend path. > > Since interrupts are already disabled here, the mutex-based locking in > > hwmod can sleep and will cause potential deadlocks. > > I accept the use-case. But maybe it would be preferable to rename > _enable(), _idle(), _shutdown() to _omap_hwmod_{enable,idle,shutdown}() ? > That would avoid the need to add new functions that just call the existing > ones. > > > - Paul > > > > > Cc: Paul Walmsley <paul@xxxxxxxxx> > > Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> > > --- > > arch/arm/mach-omap2/omap_hwmod.c | 32 > ++++++++++++++++++++++--- > > arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 + > > 2 files changed, 30 insertions(+), 4 deletions(-) > > > > diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach- > omap2/omap_hwmod.c > > index 3d11523..8b2b44a 100644 > > --- a/arch/arm/mach-omap2/omap_hwmod.c > > +++ b/arch/arm/mach-omap2/omap_hwmod.c > > @@ -1287,6 +1287,18 @@ int omap_hwmod_unregister(struct omap_hwmod *oh) > > } > > > > /** > > + * __omap_hwmod_enable - enable an omap_hwmod (non-locking version) > > + * @oh: struct omap_hwmod * > > + * > > + * Enable an omap_hwomd @oh. Intended to be called in rare cases > > + * where usage is required in atomic context. > > + */ > > +int __omap_hwmod_enable(struct omap_hwmod *oh) > > +{ > > + return _enable(oh); > > +} > > + > > +/** > > * omap_hwmod_enable - enable an omap_hwmod > > * @oh: struct omap_hwmod * > > * > > @@ -1301,12 +1313,26 @@ int omap_hwmod_enable(struct omap_hwmod *oh) > > return -EINVAL; > > > > mutex_lock(&omap_hwmod_mutex); > > - r = _enable(oh); > > + r = __omap_hwmod_enable(oh); > > mutex_unlock(&omap_hwmod_mutex); > > > > return r; > > } > > > > + > > +/** > > + * __omap_hwmod_idle - idle an omap_hwmod (non-locking) > > + * @oh: struct omap_hwmod * > > + * > > + * Idle an omap_hwomd @oh. Intended to be called in rare instances > where > > + * used in atomic context. > > + */ > > +int __omap_hwmod_idle(struct omap_hwmod *oh) > > +{ > > + _idle(oh); > > + return 0; > > +} > > + > > /** > > * omap_hwmod_idle - idle an omap_hwmod > > * @oh: struct omap_hwmod * > > @@ -1319,9 +1345,7 @@ int omap_hwmod_idle(struct omap_hwmod *oh) > > if (!oh) > > return -EINVAL; > > > > - mutex_lock(&omap_hwmod_mutex); > > - _idle(oh); > > - mutex_unlock(&omap_hwmod_mutex); > > + __omap_hwmod_idle(oh); > > BTW: The mutex locks are missing. Typo? > > 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 0eccc09..9a3f4dc 100644 > > --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h > > +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h > > @@ -486,7 +486,9 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod > *oh)); > > int omap_hwmod_late_init(void); > > > > int omap_hwmod_enable(struct omap_hwmod *oh); > > +int __omap_hwmod_enable(struct omap_hwmod *oh); > > int omap_hwmod_idle(struct omap_hwmod *oh); > > +int __omap_hwmod_idle(struct omap_hwmod *oh); > > int omap_hwmod_shutdown(struct omap_hwmod *oh); > > > > int omap_hwmod_enable_clocks(struct omap_hwmod *oh); > > -- > > 1.7.0.2 > > > > > - Paul > -- > 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 -- 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