aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/mux.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2010-12-22 21:42:35 -0500
committerTony Lindgren <tony@atomide.com>2010-12-22 21:42:35 -0500
commit8d9af88f55be89fa4c897ded3204ef12c947731e (patch)
treec9ce0643af4a2c35f456df470e27f28982abf68e /arch/arm/mach-omap2/mux.c
parent9796b323b5a1940f9ec62c3a6cf7e442bf540d53 (diff)
omap2+: Allow hwmod state changes to mux pads based on the state changes
Allow hwmod state changes to mux pads based on the state changes. By default, only enable and disable the pads. In some rare cases dynamic remuxing for the idles states is needed, this can be done by passing the enable, idle, and off pads from board-*.c file along with OMAP_DEVICE_PAD_REMUX flag. Thanks to Paul Walmsley <paul@booyaka.com> for the comments on the hwmod related changes. Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/mux.c')
-rw-r--r--arch/arm/mach-omap2/mux.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index 27eb51a224cb..17bd6394d224 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -317,6 +317,54 @@ err1:
317 return NULL; 317 return NULL;
318} 318}
319 319
320/* Assumes the calling function takes care of locking */
321void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state)
322{
323 int i;
324
325 for (i = 0; i < hmux->nr_pads; i++) {
326 struct omap_device_pad *pad = &hmux->pads[i];
327 int flags, val = -EINVAL;
328
329 flags = pad->flags;
330
331 switch (state) {
332 case _HWMOD_STATE_ENABLED:
333 if (flags & OMAP_DEVICE_PAD_ENABLED)
334 break;
335 flags |= OMAP_DEVICE_PAD_ENABLED;
336 val = pad->enable;
337 pr_debug("%s: Enabling %s %x\n", __func__,
338 pad->name, val);
339 break;
340 case _HWMOD_STATE_IDLE:
341 if (!(flags & OMAP_DEVICE_PAD_REMUX))
342 break;
343 flags &= ~OMAP_DEVICE_PAD_ENABLED;
344 val = pad->idle;
345 pr_debug("%s: Idling %s %x\n", __func__,
346 pad->name, val);
347 break;
348 case _HWMOD_STATE_DISABLED:
349 default:
350 /* Use safe mode unless OMAP_DEVICE_PAD_REMUX */
351 if (flags & OMAP_DEVICE_PAD_REMUX)
352 val = pad->off;
353 else
354 val = OMAP_MUX_MODE7;
355 flags &= ~OMAP_DEVICE_PAD_ENABLED;
356 pr_debug("%s: Disabling %s %x\n", __func__,
357 pad->name, val);
358 };
359
360 if (val >= 0) {
361 omap_mux_write(pad->partition, val,
362 pad->mux->reg_offset);
363 pad->flags = flags;
364 }
365 }
366}
367
320#ifdef CONFIG_DEBUG_FS 368#ifdef CONFIG_DEBUG_FS
321 369
322#define OMAP_MUX_MAX_NR_FLAGS 10 370#define OMAP_MUX_MAX_NR_FLAGS 10