diff options
-rw-r--r-- | arch/arm/plat-omap/include/mach/mcbsp.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-omap/mcbsp.c | 84 | ||||
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 5 |
3 files changed, 28 insertions, 63 deletions
diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h index 70e950e295e1..63a3f254af7b 100644 --- a/arch/arm/plat-omap/include/mach/mcbsp.h +++ b/arch/arm/plat-omap/include/mach/mcbsp.h | |||
@@ -436,8 +436,6 @@ int omap_mcbsp_request(unsigned int id); | |||
436 | void omap_mcbsp_free(unsigned int id); | 436 | void omap_mcbsp_free(unsigned int id); |
437 | void omap_mcbsp_start(unsigned int id, int tx, int rx); | 437 | void omap_mcbsp_start(unsigned int id, int tx, int rx); |
438 | void omap_mcbsp_stop(unsigned int id, int tx, int rx); | 438 | void omap_mcbsp_stop(unsigned int id, int tx, int rx); |
439 | void omap_mcbsp_xmit_enable(unsigned int id, u8 enable); | ||
440 | void omap_mcbsp_recv_enable(unsigned int id, u8 enable); | ||
441 | void omap_mcbsp_xmit_word(unsigned int id, u32 word); | 439 | void omap_mcbsp_xmit_word(unsigned int id, u32 word); |
442 | u32 omap_mcbsp_recv_word(unsigned int id); | 440 | u32 omap_mcbsp_recv_word(unsigned int id); |
443 | 441 | ||
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c index ee60ab68251d..8dc7927906f1 100644 --- a/arch/arm/plat-omap/mcbsp.c +++ b/arch/arm/plat-omap/mcbsp.c | |||
@@ -529,11 +529,13 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx) | |||
529 | } | 529 | } |
530 | 530 | ||
531 | /* Enable transmitter and receiver */ | 531 | /* Enable transmitter and receiver */ |
532 | tx &= 1; | ||
532 | w = OMAP_MCBSP_READ(io_base, SPCR2); | 533 | w = OMAP_MCBSP_READ(io_base, SPCR2); |
533 | OMAP_MCBSP_WRITE(io_base, SPCR2, w | (tx & 1)); | 534 | OMAP_MCBSP_WRITE(io_base, SPCR2, w | tx); |
534 | 535 | ||
536 | rx &= 1; | ||
535 | w = OMAP_MCBSP_READ(io_base, SPCR1); | 537 | w = OMAP_MCBSP_READ(io_base, SPCR1); |
536 | OMAP_MCBSP_WRITE(io_base, SPCR1, w | (rx & 1)); | 538 | OMAP_MCBSP_WRITE(io_base, SPCR1, w | rx); |
537 | 539 | ||
538 | /* | 540 | /* |
539 | * Worst case: CLKSRG*2 = 8000khz: (1/8000) * 2 * 2 usec | 541 | * Worst case: CLKSRG*2 = 8000khz: (1/8000) * 2 * 2 usec |
@@ -549,6 +551,16 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx) | |||
549 | OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7)); | 551 | OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7)); |
550 | } | 552 | } |
551 | 553 | ||
554 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | ||
555 | /* Release the transmitter and receiver */ | ||
556 | w = OMAP_MCBSP_READ(io_base, XCCR); | ||
557 | w &= ~(tx ? XDISABLE : 0); | ||
558 | OMAP_MCBSP_WRITE(io_base, XCCR, w); | ||
559 | w = OMAP_MCBSP_READ(io_base, RCCR); | ||
560 | w &= ~(rx ? RDISABLE : 0); | ||
561 | OMAP_MCBSP_WRITE(io_base, RCCR, w); | ||
562 | } | ||
563 | |||
552 | /* Dump McBSP Regs */ | 564 | /* Dump McBSP Regs */ |
553 | omap_mcbsp_dump_reg(id); | 565 | omap_mcbsp_dump_reg(id); |
554 | } | 566 | } |
@@ -570,12 +582,24 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
570 | io_base = mcbsp->io_base; | 582 | io_base = mcbsp->io_base; |
571 | 583 | ||
572 | /* Reset transmitter */ | 584 | /* Reset transmitter */ |
585 | tx &= 1; | ||
586 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | ||
587 | w = OMAP_MCBSP_READ(io_base, XCCR); | ||
588 | w |= (tx ? XDISABLE : 0); | ||
589 | OMAP_MCBSP_WRITE(io_base, XCCR, w); | ||
590 | } | ||
573 | w = OMAP_MCBSP_READ(io_base, SPCR2); | 591 | w = OMAP_MCBSP_READ(io_base, SPCR2); |
574 | OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(tx & 1)); | 592 | OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~tx); |
575 | 593 | ||
576 | /* Reset receiver */ | 594 | /* Reset receiver */ |
595 | rx &= 1; | ||
596 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | ||
597 | w = OMAP_MCBSP_READ(io_base, RCCR); | ||
598 | w |= (tx ? RDISABLE : 0); | ||
599 | OMAP_MCBSP_WRITE(io_base, RCCR, w); | ||
600 | } | ||
577 | w = OMAP_MCBSP_READ(io_base, SPCR1); | 601 | w = OMAP_MCBSP_READ(io_base, SPCR1); |
578 | OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~(rx & 1)); | 602 | OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~rx); |
579 | 603 | ||
580 | idle = !((OMAP_MCBSP_READ(io_base, SPCR2) | | 604 | idle = !((OMAP_MCBSP_READ(io_base, SPCR2) | |
581 | OMAP_MCBSP_READ(io_base, SPCR1)) & 1); | 605 | OMAP_MCBSP_READ(io_base, SPCR1)) & 1); |
@@ -588,58 +612,6 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx) | |||
588 | } | 612 | } |
589 | EXPORT_SYMBOL(omap_mcbsp_stop); | 613 | EXPORT_SYMBOL(omap_mcbsp_stop); |
590 | 614 | ||
591 | void omap_mcbsp_xmit_enable(unsigned int id, u8 enable) | ||
592 | { | ||
593 | struct omap_mcbsp *mcbsp; | ||
594 | void __iomem *io_base; | ||
595 | u16 w; | ||
596 | |||
597 | if (!(cpu_is_omap2430() || cpu_is_omap34xx())) | ||
598 | return; | ||
599 | |||
600 | if (!omap_mcbsp_check_valid_id(id)) { | ||
601 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
602 | return; | ||
603 | } | ||
604 | |||
605 | mcbsp = id_to_mcbsp_ptr(id); | ||
606 | io_base = mcbsp->io_base; | ||
607 | |||
608 | w = OMAP_MCBSP_READ(io_base, XCCR); | ||
609 | |||
610 | if (enable) | ||
611 | OMAP_MCBSP_WRITE(io_base, XCCR, w & ~(XDISABLE)); | ||
612 | else | ||
613 | OMAP_MCBSP_WRITE(io_base, XCCR, w | XDISABLE); | ||
614 | } | ||
615 | EXPORT_SYMBOL(omap_mcbsp_xmit_enable); | ||
616 | |||
617 | void omap_mcbsp_recv_enable(unsigned int id, u8 enable) | ||
618 | { | ||
619 | struct omap_mcbsp *mcbsp; | ||
620 | void __iomem *io_base; | ||
621 | u16 w; | ||
622 | |||
623 | if (!(cpu_is_omap2430() || cpu_is_omap34xx())) | ||
624 | return; | ||
625 | |||
626 | if (!omap_mcbsp_check_valid_id(id)) { | ||
627 | printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1); | ||
628 | return; | ||
629 | } | ||
630 | |||
631 | mcbsp = id_to_mcbsp_ptr(id); | ||
632 | io_base = mcbsp->io_base; | ||
633 | |||
634 | w = OMAP_MCBSP_READ(io_base, RCCR); | ||
635 | |||
636 | if (enable) | ||
637 | OMAP_MCBSP_WRITE(io_base, RCCR, w & ~(RDISABLE)); | ||
638 | else | ||
639 | OMAP_MCBSP_WRITE(io_base, RCCR, w | RDISABLE); | ||
640 | } | ||
641 | EXPORT_SYMBOL(omap_mcbsp_recv_enable); | ||
642 | |||
643 | /* polled mcbsp i/o operations */ | 615 | /* polled mcbsp i/o operations */ |
644 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) | 616 | int omap_mcbsp_pollwrite(unsigned int id, u16 buf) |
645 | { | 617 | { |
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 89e8bce114af..0e173e7e0c3a 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -231,11 +231,6 @@ static int omap_mcbsp_dai_trigger(struct snd_pcm_substream *substream, int cmd, | |||
231 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 231 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
232 | mcbsp_data->active++; | 232 | mcbsp_data->active++; |
233 | omap_mcbsp_start(mcbsp_data->bus_id, play, !play); | 233 | omap_mcbsp_start(mcbsp_data->bus_id, play, !play); |
234 | /* Make sure data transfer is frame synchronized */ | ||
235 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | ||
236 | omap_mcbsp_xmit_enable(mcbsp_data->bus_id, 1); | ||
237 | else | ||
238 | omap_mcbsp_recv_enable(mcbsp_data->bus_id, 1); | ||
239 | break; | 234 | break; |
240 | 235 | ||
241 | case SNDRV_PCM_TRIGGER_STOP: | 236 | case SNDRV_PCM_TRIGGER_STOP: |