Commit 293b699a authored by Kyungmin Park's avatar Kyungmin Park Committed by Tony Lindgren

[PATCH] ARM: OMAP: sound support on omap24xx

This patch enable OMAP sound on omap24xx
To test omap sound, you first have to patch the first spi patch from komal
shah not the latest spi patch.

It also adds 'OSS L/R Channel Interchange fix' on tsc2101

Any comments are welcome.
parent 9a328486
...@@ -13,14 +13,18 @@ config SOUND_OMAP ...@@ -13,14 +13,18 @@ config SOUND_OMAP
config SOUND_OMAP_TSC2101 config SOUND_OMAP_TSC2101
tristate "TSC2101 Stereo Codec" tristate "TSC2101 Stereo Codec"
depends on SOUND_OMAP && ( MACH_OMAP_H2 || MACH_OMAP_H3 ) depends on SOUND_OMAP && ( MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_H4)
select OMAP_TSC2101 select OMAP_TSC2101 if ( MACH_OMAP_H2 || MACH_OMAP_H3 )
select OMAP_UWIRE if ARCH_OMAP select OMAP_UWIRE if ARCH_OMAP1
---help--- ---help---
Tsc2101 Audio Codec Driver for OMAP will be enabled. Tsc2101 Audio Codec Driver for OMAP will be enabled.
Will also Enable the following: Will also Enable the following:
case OMAP1:
1. uWire Driver based on Platform 1. uWire Driver based on Platform
2. TSC2101 Glue driver 2. TSC2101 Glue driver
case OMAP2:
1. McSPI Driver based on Platform
2. TSC2101 Glue driver
config SOUND_OMAP_AIC23 config SOUND_OMAP_AIC23
tristate "AIC23 Stereo Codec" tristate "AIC23 Stereo Codec"
......
...@@ -701,12 +701,25 @@ static int audio_set_dma_params_play(int channel, dma_addr_t dma_ptr, ...@@ -701,12 +701,25 @@ static int audio_set_dma_params_play(int channel, dma_addr_t dma_ptr,
int dt = 0x1; /* data type 16 */ int dt = 0x1; /* data type 16 */
int cen = 32; /* Stereo */ int cen = 32; /* Stereo */
int cfn = dma_size / (2 * cen); int cfn = dma_size / (2 * cen);
unsigned long dest_start;
int dest_port = 0;
int sync_dev = 0;
FN_IN; FN_IN;
omap_set_dma_dest_params(channel, 0x05, 0x00,
(OMAP1610_MCBSP1_BASE + 0x806), if (cpu_is_omap16xx()) {
0, 0); dest_start = (OMAP1610_MCBSP1_BASE + 0x806);
omap_set_dma_src_params(channel, 0x00, 0x01, dma_ptr, 0, 0); dest_port = OMAP_DMA_PORT_MPUI;
omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0); }
if (cpu_is_omap24xx()) {
dest_start = AUDIO_MCBSP_DATAWRITE;
sync_dev = AUDIO_DMA_TX;
}
omap_set_dma_dest_params(channel, dest_port, OMAP_DMA_AMODE_CONSTANT, dest_start, 0, 0);
omap_set_dma_src_params(channel, 0, OMAP_DMA_AMODE_POST_INC, dma_ptr, 0, 0);
omap_set_dma_transfer_params(channel, dt, cen, cfn, OMAP_DMA_SYNC_ELEMENT, sync_dev, 0);
FN_OUT(0); FN_OUT(0);
return 0; return 0;
} }
...@@ -717,12 +730,27 @@ static int audio_set_dma_params_capture(int channel, dma_addr_t dma_ptr, ...@@ -717,12 +730,27 @@ static int audio_set_dma_params_capture(int channel, dma_addr_t dma_ptr,
int dt = 0x1; /* data type 16 */ int dt = 0x1; /* data type 16 */
int cen = 16; /* mono */ int cen = 16; /* mono */
int cfn = dma_size / (2 * cen); int cfn = dma_size / (2 * cen);
unsigned long src_start;
int src_port = 0;
int sync_dev = 0;
int src_sync = 0;
FN_IN; FN_IN;
omap_set_dma_src_params(channel, 0x05, 0x00,
(OMAP1610_MCBSP1_BASE + 0x802), if (cpu_is_omap16xx()) {
0, 0); src_start = (OMAP1610_MCBSP1_BASE + 0x802);
omap_set_dma_dest_params(channel, 0x00, 0x01, dma_ptr, 0, 0); src_port = OMAP_DMA_PORT_MPUI;
omap_set_dma_transfer_params(channel, dt, cen, cfn, 0x00, 0, 0); }
if (cpu_is_omap24xx()) {
src_start = AUDIO_MCBSP_DATAREAD;
sync_dev = AUDIO_DMA_RX;
src_sync = 1;
}
omap_set_dma_src_params(channel, src_port, OMAP_DMA_AMODE_CONSTANT, src_start, 0, 0);
omap_set_dma_dest_params(channel, 0, OMAP_DMA_AMODE_POST_INC, dma_ptr, 0, 0);
omap_set_dma_transfer_params(channel, dt, cen, cfn, OMAP_DMA_SYNC_ELEMENT, sync_dev, src_sync);
FN_OUT(0); FN_OUT(0);
return 0; return 0;
} }
...@@ -732,10 +760,10 @@ static int audio_start_dma_chain(audio_stream_t * s) ...@@ -732,10 +760,10 @@ static int audio_start_dma_chain(audio_stream_t * s)
int channel = s->lch[s->dma_q_head]; int channel = s->lch[s->dma_q_head];
FN_IN; FN_IN;
if (!s->started) { if (!s->started) {
s->hw_stop(); /* stops McBSP Interface */ s->hw_stop(); /* stops McBSP Interface */
omap_start_dma(channel); omap_start_dma(channel);
s->started = 1; s->started = 1;
s->hw_start(); /* start McBSP interface */ s->hw_start(); /* start McBSP interface */
} }
/* else the dma itself will progress forward with out our help */ /* else the dma itself will progress forward with out our help */
FN_OUT(0); FN_OUT(0);
...@@ -850,8 +878,9 @@ static void sound_dma_irq_handler(int sound_curr_lch, u16 ch_status, void *data) ...@@ -850,8 +878,9 @@ static void sound_dma_irq_handler(int sound_curr_lch, u16 ch_status, void *data)
DPRINTK("lch=%d,status=0x%x, dma_status=%d, data=%p\n", sound_curr_lch, DPRINTK("lch=%d,status=0x%x, dma_status=%d, data=%p\n", sound_curr_lch,
ch_status, dma_status, data); ch_status, dma_status, data);
if (dma_status & (DCSR_ERROR)) { if (dma_status) {
OMAP_DMA_CCR_REG(sound_curr_lch) &= ~DCCR_EN; if (cpu_is_omap16xx() && (dma_status & (DCSR_ERROR)))
OMAP_DMA_CCR_REG(sound_curr_lch) &= ~DCCR_EN;
ERR("DCSR_ERROR!\n"); ERR("DCSR_ERROR!\n");
FN_OUT(-1); FN_OUT(-1);
return; return;
......
...@@ -48,9 +48,10 @@ ...@@ -48,9 +48,10 @@
#include "omap-audio.h" #include "omap-audio.h"
#include "omap-audio-dma-intfc.h" #include "omap-audio-dma-intfc.h"
#include <asm/arch/mcbsp.h> #include <asm/arch/mcbsp.h>
#if CONFIG_ARCH_OMAP16XX #ifdef CONFIG_ARCH_OMAP16XX
#include <../drivers/ssi/omap-uwire.h> #include <../drivers/ssi/omap-uwire.h>
#include <asm/arch/dsp_common.h> #include <asm/arch/dsp_common.h>
#elif defined(CONFIG_ARCH_OMAP24XX)
#else #else
#error "Unsupported configuration" #error "Unsupported configuration"
#endif #endif
...@@ -70,12 +71,10 @@ ...@@ -70,12 +71,10 @@
#define CODEC_NAME "TSC2101" #define CODEC_NAME "TSC2101"
#if CONFIG_ARCH_OMAP16XX #ifdef CONFIG_ARCH_OMAP16XX
#define PLATFORM_NAME "OMAP16XX" #define PLATFORM_NAME "OMAP16XX"
#endif #elif defined(CONFIG_ARCH_OMAP24XX)
#define PLATFORM_NAME "OMAP2"
#if CONFIG_ARCH_OMAP16XX
#define OMAP_DSP_BASE 0xE0000000
#endif #endif
/* Define to set the tsc as the master w.r.t McBSP */ /* Define to set the tsc as the master w.r.t McBSP */
...@@ -90,9 +89,9 @@ ...@@ -90,9 +89,9 @@
#define LEAVE_CS 0x80 #define LEAVE_CS 0x80
/* Select the McBSP For Audio */ /* Select the McBSP For Audio */
#if CONFIG_ARCH_OMAP16XX /* 16XX is MCBSP1 and 24XX is MCBSP2*/
#define AUDIO_MCBSP OMAP_MCBSP1 /* see include/asm-arm/arch-omap/mcbsp.h */
#else #ifndef AUDIO_MCBSP
#error "UnSupported Configuration" #error "UnSupported Configuration"
#endif #endif
...@@ -147,16 +146,32 @@ ...@@ -147,16 +146,32 @@
/***************************** Data Structures **********************************/ /***************************** Data Structures **********************************/
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 = { static audio_stream_t output_stream = {
.id = "TSC2101 out", .id = "TSC2101 out",
.dma_dev = OMAP_DMA_MCBSP1_TX, .dma_dev = AUDIO_DMA_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 = { static audio_stream_t input_stream = {
.id = "TSC2101 in", .id = "TSC2101 in",
.dma_dev = OMAP_DMA_MCBSP1_RX, .dma_dev = AUDIO_DMA_RX,
.input_or_output = FMODE_READ .input_or_output = FMODE_READ,
.hw_start = audio_ifc_start,
.hw_stop = audio_ifc_stop,
}; };
static int audio_dev_id, mixer_dev_id; static int audio_dev_id, mixer_dev_id;
...@@ -227,9 +242,9 @@ static struct omap_mcbsp_reg_cfg initial_config = { ...@@ -227,9 +242,9 @@ static struct omap_mcbsp_reg_cfg initial_config = {
.srgr2 = GSYNC | CLKSP | FSGM | FPER(31), .srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
/* platform specific initialization */ /* platform specific initialization */
#if CONFIG_MACH_OMAP_H2 #ifdef CONFIG_MACH_OMAP_H2
.pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP,
#elif CONFIG_MACH_OMAP_H3 #elif defined(CONFIG_MACH_OMAP_H3) || defined(CONFIG_MACH_OMAP_H4)
#ifndef TSC_MASTER #ifndef TSC_MASTER
.pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP, .pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment