From 7eecbabfb7b5965db812823071df91712c4be68b Mon Sep 17 00:00:00 2001 From: Dirk Behme Date: Tue, 3 Jan 2006 09:48:03 -0800 Subject: [PATCH] ARM: OMAP: OSS L/R Channel Interchange fix OSS L/R Channel Interchange fix as proposed by Ajaya Babu Anne Signed-off-by: Dirk Behme Signed-off-by: Tony Lindgren --- sound/oss/omap-audio-aic23.c | 23 +++++++++++++++++++++-- sound/oss/omap-audio-dma-intfc.c | 4 ++++ sound/oss/omap-audio.h | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sound/oss/omap-audio-aic23.c b/sound/oss/omap-audio-aic23.c index 1be0d768e46..218f15d5399 100644 --- a/sound/oss/omap-audio-aic23.c +++ b/sound/oss/omap-audio-aic23.c @@ -111,16 +111,35 @@ #define NUMBER_SAMPLE_RATES_SUPPORTED 9 +/* + * HW interface start and stop helper functions + */ +static int audio_ifc_start(void) +{ + omap_mcbsp_start(AUDIO_MCBSP); + return 0; +} + +static int audio_ifc_stop(void) +{ + omap_mcbsp_stop(AUDIO_MCBSP); + return 0; +} + static audio_stream_t output_stream = { .id = "AIC23 out", .dma_dev = OMAP_DMA_MCBSP1_TX, - .input_or_output = FMODE_WRITE + .input_or_output = FMODE_WRITE, + .hw_start = audio_ifc_start, + .hw_stop = audio_ifc_stop }; static audio_stream_t input_stream = { .id = "AIC23 in", .dma_dev = OMAP_DMA_MCBSP1_RX, - .input_or_output = FMODE_READ + .input_or_output = FMODE_READ, + .hw_start = audio_ifc_start, + .hw_stop = audio_ifc_stop }; static struct clk *aic23_mclk = 0; diff --git a/sound/oss/omap-audio-dma-intfc.c b/sound/oss/omap-audio-dma-intfc.c index 9f3451731c7..a9392dd5e95 100644 --- a/sound/oss/omap-audio-dma-intfc.c +++ b/sound/oss/omap-audio-dma-intfc.c @@ -28,6 +28,8 @@ * 2004-11-01 Nishanth Menon - 16xx platform code base modified to support multi channel chaining. * * 2004-12-15 Nishanth Menon - Improved 16xx platform channel logic introduced - tasklets, queue handling updated + * + * 2005-12-10 Dirk Behme - Added L/R Channel Interchange fix as proposed by Ajaya Babu */ #include @@ -730,8 +732,10 @@ static int audio_start_dma_chain(audio_stream_t * s) int channel = s->lch[s->dma_q_head]; FN_IN; if (!s->started) { + s->hw_stop(); /* stops McBSP Interface */ omap_start_dma(channel); s->started = 1; + s->hw_start(); /* start McBSP interface */ } /* else the dma itself will progress forward with out our help */ FN_OUT(0); diff --git a/sound/oss/omap-audio.h b/sound/oss/omap-audio.h index d3cc11b456f..58eff3130c3 100644 --- a/sound/oss/omap-audio.h +++ b/sound/oss/omap-audio.h @@ -20,6 +20,8 @@ * 2004/08/12 Nishanth Menon - Modified to integrate Audio requirements on 1610,1710 platforms * * 2004/04/04 Nishanth menon - Added hooks for power management + * + * 2005/12/10 Dirk Behme - Added L/R Channel Interchange fix as proposed by Ajaya Babu */ #ifndef __OMAP_AUDIO_H @@ -75,6 +77,8 @@ typedef struct { unsigned stopped:1; /* might be active but stopped */ unsigned spin_idle:1; /* have DMA spin on zeros when idle */ unsigned linked:1; /* dma channels linked */ + int (*hw_start)(void); /* interface to start HW interface, e.g. McBSP */ + int (*hw_stop)(void); /* interface to stop HW interface, e.g. McBSP */ } audio_stream_t; /* -- 2.41.1