diff options
author | Eero Nurkkala <ext-eero.nurkkala@nokia.com> | 2009-08-20 09:18:07 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-08-20 15:10:25 -0400 |
commit | 9abea08e43c6cfc18399e42cbc6028d111532f61 (patch) | |
tree | 6ddca6c55c976dbfe4221a70deaea64910fdf197 /arch/arm/plat-omap/mcbsp.c | |
parent | a4d7d550a9cfdfbc615383a08e9afa39d5a6d875 (diff) |
OMAP: McBSP: Provide functions for ASoC frame syncronization
ASoC has an annoying bug letting either L or R channel to be
played on L channel. In other words, L and R channels can
switch at random. This provides McBSP funtionality that may
be used to fix this feature.
Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'arch/arm/plat-omap/mcbsp.c')
-rw-r--r-- | arch/arm/plat-omap/mcbsp.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index a3d2313460b3..0aa2524186fb 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -412,6 +412,58 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
412 | } | 412 | } |
413 | EXPORT_SYMBOL(omap_mcbsp_stop); | 413 | EXPORT_SYMBOL(omap_mcbsp_stop); |
414 | 414 | ||
415 | void omap_mcbsp_xmit_enable(unsigned int id, u8 enable) | ||
416 | { | ||
417 | struct omap_mcbsp *mcbsp; | ||
418 | void __iomem *io_base; | ||
419 | u16 w; | ||
420 | |||
421 | if (!(cpu_is_omap2430() || cpu_is_omap34xx())) | ||
422 | return; | ||
423 | |||
424 | if (!omap_mcbsp_check_valid_id(id)) { | ||
425 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
426 | return; | ||
427 | } | ||
428 | |||
429 | mcbsp = id_to_mcbsp_ptr(id); | ||
430 | io_base = mcbsp->io_base; | ||
431 | |||
432 | w = OMAP_MCBSP_READ(io_base, XCCR); | ||
433 | |||
434 | if (enable) | ||
435 | OMAP_MCBSP_WRITE(io_base, XCCR, w & ~(XDISABLE)); | ||
436 | else | ||
437 | OMAP_MCBSP_WRITE(io_base, XCCR, w | XDISABLE); | ||
438 | } | ||
439 | EXPORT_SYMBOL(omap_mcbsp_xmit_enable); | ||
440 | |||
441 | void omap_mcbsp_recv_enable(unsigned int id, u8 enable) | ||
442 | { | ||
443 | struct omap_mcbsp *mcbsp; | ||
444 | void __iomem *io_base; | ||
445 | u16 w; | ||
446 | |||
447 | if (!(cpu_is_omap2430() || cpu_is_omap34xx())) | ||
448 | return; | ||
449 | |||
450 | if (!omap_mcbsp_check_valid_id(id)) { | ||
451 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
452 | return; | ||
453 | } | ||
454 | |||
455 | mcbsp = id_to_mcbsp_ptr(id); | ||
456 | io_base = mcbsp->io_base; | ||
457 | |||
458 | w = OMAP_MCBSP_READ(io_base, RCCR); | ||
459 | |||
460 | if (enable) | ||
461 | OMAP_MCBSP_WRITE(io_base, RCCR, w & ~(RDISABLE)); | ||
462 | else | ||
463 | OMAP_MCBSP_WRITE(io_base, RCCR, w | RDISABLE); | ||
464 | } | ||
465 | EXPORT_SYMBOL(omap_mcbsp_recv_enable); | ||
466 | |||
415 | /* polled mcbsp i/o operations */ | 467 | /* polled mcbsp i/o operations */ |
416 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) | 468 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) |
417 | { | 469 | { |