diff options
author | Xinyu Chen <xinyu.chen@freescale.com> | 2012-04-20 13:02:04 +0800 |
---|---|---|
committer | Xinyu Chen <xinyu.chen@freescale.com> | 2012-04-20 13:02:04 +0800 |
commit | b0cf397cecdecc102b82fc844b7a9e098d841187 (patch) | |
tree | 681e410089711d7e8d13cd819004e698fa6fec14 /sound | |
parent | eb1da050c08bb961a1e45dd51f97821d3eeb2ae9 (diff) | |
parent | a7fbbad7276b41e8b338afafcaedf8c005de5c48 (diff) |
Merge remote branch 'fsl-linux-sdk/imx_3.0.15_12.04.01' into imx_3.0.15_android
Conflicts:
arch/arm/kernel/traps.c
arch/arm/mach-mx6/board-mx6q_sabresd.c
arch/arm/mach-mx6/cpu.c
arch/arm/mach-mx6/system.c
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/cs42888.c | 14 | ||||
-rw-r--r-- | sound/soc/codecs/wm8962.c | 3 | ||||
-rw-r--r-- | sound/soc/imx/imx-esai.c | 22 | ||||
-rw-r--r-- | sound/soc/imx/imx-hdmi-dma.c | 35 | ||||
-rw-r--r-- | sound/soc/imx/imx-ssi.c | 6 | ||||
-rw-r--r-- | sound/soc/imx/imx-wm8962.c | 4 |
6 files changed, 59 insertions, 25 deletions
diff --git a/sound/soc/codecs/cs42888.c b/sound/soc/codecs/cs42888.c index 86feec2676df..63d244a8d00a 100644 --- a/sound/soc/codecs/cs42888.c +++ b/sound/soc/codecs/cs42888.c @@ -478,11 +478,17 @@ static const struct snd_soc_dapm_route audio_map[] = { { "AOUT4R", NULL, "PWR" }, /* Capture */ - { "ADC1", NULL, "AIN1L" }, - { "ADC1", NULL, "AIN1R" }, + { "PWR", NULL, "AIN1L" }, + { "PWR", NULL, "AIN1R" }, - { "ADC2", NULL, "AIN2L" }, - { "ADC2", NULL, "AIN2R" }, + { "PWR", NULL, "AIN2L" }, + { "PWR", NULL, "AIN2R" }, + + { "ADC1", NULL, "PWR" }, + { "ADC1", NULL, "PWR" }, + + { "ADC2", NULL, "PWR" }, + { "ADC2", NULL, "PWR" }, }; diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index b8be06b3344a..824a6fa8f487 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c @@ -3520,7 +3520,8 @@ static int wm8962_mute(struct snd_soc_dai *dai, int mute) WM8962_DAC_MUTE, val); } -#define WM8962_RATES SNDRV_PCM_RATE_8000_96000 +#define WM8962_RATES (SNDRV_PCM_RATE_8000_48000 |\ + SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) #define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) diff --git a/sound/soc/imx/imx-esai.c b/sound/soc/imx/imx-esai.c index f6361716c20c..5f95ecce842e 100644 --- a/sound/soc/imx/imx-esai.c +++ b/sound/soc/imx/imx-esai.c @@ -284,12 +284,10 @@ static int imx_esai_startup(struct snd_pcm_substream *substream, writel(ESAI_GPIO_ESAI, esai->base + ESAI_PCRC); } - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) local_esai->imx_esai_txrx_state |= IMX_DAI_ESAI_TX; - } else { + else local_esai->imx_esai_txrx_state |= IMX_DAI_ESAI_RX; - writel(ESAI_RCR_RPR, esai->base + ESAI_RCR); - } ESAI_DUMP(); return 0; @@ -375,6 +373,14 @@ static int imx_esai_hw_rx_params(struct snd_pcm_substream *substream, rfcr |= ESAI_WORD_LEN_16; rcr |= ESAI_RCR_RSHFD_MSB | ESAI_RCR_RSWS_STL32_WDL16; break; + case SNDRV_PCM_FORMAT_S20_3LE: + rfcr |= ESAI_WORD_LEN_20; + rcr |= ESAI_RCR_RSHFD_MSB | ESAI_RCR_RSWS_STL32_WDL20; + break; + case SNDRV_PCM_FORMAT_S24_LE: + rfcr |= ESAI_WORD_LEN_24; + rcr |= ESAI_RCR_RSHFD_MSB | ESAI_RCR_RSWS_STL32_WDL24; + break; } channels = params_channels(params); @@ -438,7 +444,6 @@ static int imx_esai_trigger(struct snd_pcm_substream *substream, int cmd, { struct imx_esai *esai = snd_soc_dai_get_drvdata(cpu_dai); u32 reg, tfcr = 0, rfcr = 0; - u32 temp; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { tfcr = readl(esai->base + ESAI_TFCR); @@ -457,12 +462,8 @@ static int imx_esai_trigger(struct snd_pcm_substream *substream, int cmd, reg |= ESAI_TCR_TE(substream->runtime->channels); writel(reg, esai->base + ESAI_TCR); } else { - temp = readl(esai->base + ESAI_TCR); - temp &= ~ESAI_TCR_TPR; - writel(temp, esai->base + ESAI_TCR); rfcr |= ESAI_RFCR_RFEN; writel(rfcr, esai->base + ESAI_RFCR); - reg &= ~ESAI_RCR_RPR; reg |= ESAI_RCR_RE(substream->runtime->channels); writel(reg, esai->base + ESAI_RCR); } @@ -473,7 +474,6 @@ static int imx_esai_trigger(struct snd_pcm_substream *substream, int cmd, if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { reg &= ~ESAI_TCR_TE(substream->runtime->channels); writel(reg, esai->base + ESAI_TCR); - writel(reg, esai->base + ESAI_TCR); tfcr |= ESAI_TFCR_TFR; tfcr &= ~ESAI_TFCR_TFEN; writel(tfcr, esai->base + ESAI_TFCR); @@ -482,8 +482,6 @@ static int imx_esai_trigger(struct snd_pcm_substream *substream, int cmd, } else { reg &= ~ESAI_RCR_RE(substream->runtime->channels); writel(reg, esai->base + ESAI_RCR); - reg |= ESAI_RCR_RPR; - writel(reg, esai->base + ESAI_RCR); rfcr |= ESAI_RFCR_RFR; rfcr &= ~ESAI_RFCR_RFEN; writel(rfcr, esai->base + ESAI_RFCR); diff --git a/sound/soc/imx/imx-hdmi-dma.c b/sound/soc/imx/imx-hdmi-dma.c index c8e88ff79e3b..1bd36ca1ea57 100644 --- a/sound/soc/imx/imx-hdmi-dma.c +++ b/sound/soc/imx/imx-hdmi-dma.c @@ -35,6 +35,11 @@ #include <mach/mxc_hdmi.h> #include "imx-hdmi.h" +#define HDMI_DMA_BURST_UNSPECIFIED_LEGNTH 0 +#define HDMI_DMA_BURST_INCR4 1 +#define HDMI_DMA_BURST_INCR8 2 +#define HDMI_DMA_BURST_INCR16 3 + struct imx_hdmi_dma_runtime_data { struct snd_pcm_substream *tx_substream; @@ -315,16 +320,16 @@ static void hdmi_dma_set_incr_type(int incr_type) HDMI_AHB_DMA_CONF0_INCR_TYPE_MASK); switch (incr_type) { - case 1: + case HDMI_DMA_BURST_UNSPECIFIED_LEGNTH: break; - case 4: + case HDMI_DMA_BURST_INCR4: value |= HDMI_AHB_DMA_CONF0_BURST_MODE; break; - case 8: + case HDMI_DMA_BURST_INCR8: value |= HDMI_AHB_DMA_CONF0_BURST_MODE | HDMI_AHB_DMA_CONF0_INCR8; break; - case 16: + case HDMI_DMA_BURST_INCR16: value |= HDMI_AHB_DMA_CONF0_BURST_MODE | HDMI_AHB_DMA_CONF0_INCR16; break; @@ -359,11 +364,27 @@ static void hdmi_dma_enable_channels(int channels) } } +static void hdmi_dma_set_thrsld(void) +{ + int rev = hdmi_readb(HDMI_REVISION_ID); + + switch (rev) { + case 0x0a: + hdmi_writeb(126, HDMI_AHB_DMA_THRSLD); + break; + default: + hdmi_writeb(64, HDMI_AHB_DMA_THRSLD); + break; + } + + pr_debug("HDMI_AHB_DMA_THRSLD 0x%02x\n", hdmi_readb(HDMI_AHB_DMA_THRSLD)); +} + static void hdmi_dma_configure_dma(int channels) { hdmi_dma_enable_hlock(1); - hdmi_dma_set_incr_type(4); - hdmi_writeb(64, HDMI_AHB_DMA_THRSLD); + hdmi_dma_set_incr_type(HDMI_DMA_BURST_UNSPECIFIED_LEGNTH); + hdmi_dma_set_thrsld(); hdmi_dma_enable_channels(channels); } @@ -548,6 +569,7 @@ static int hdmi_dma_trigger(struct snd_pcm_substream *substream, int cmd) hdmi_dma_irq_mask(0); hdmi_dma_priv->tx_active = true; hdmi_dma_start(); + hdmi_set_dma_mode(1); break; case SNDRV_PCM_TRIGGER_STOP: @@ -555,6 +577,7 @@ static int hdmi_dma_trigger(struct snd_pcm_substream *substream, int cmd) case SNDRV_PCM_TRIGGER_PAUSE_PUSH: hdmi_dma_priv->tx_active = false; hdmi_dma_stop(); + hdmi_set_dma_mode(0); hdmi_dma_irq_mask(1); break; diff --git a/sound/soc/imx/imx-ssi.c b/sound/soc/imx/imx-ssi.c index be2717587c59..a37c98b925ac 100644 --- a/sound/soc/imx/imx-ssi.c +++ b/sound/soc/imx/imx-ssi.c @@ -157,7 +157,13 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) if (ssi->flags & IMX_SSI_SYN) scr |= SSI_SCR_SYN; + /* Dual-FIFO support */ + strcr |= SSI_STCR_TFEN1; + scr |= SSI_SCR_TCH_EN; + writel(strcr, ssi->base + SSI_STCR); + if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) == SND_SOC_DAIFMT_CBS_CFS) + strcr &= ~(SSI_STCR_TFDIR | SSI_STCR_TXDIR); writel(strcr, ssi->base + SSI_SRCR); writel(scr, ssi->base + SSI_SCR); diff --git a/sound/soc/imx/imx-wm8962.c b/sound/soc/imx/imx-wm8962.c index 2885d3a47889..74950ad79861 100644 --- a/sound/soc/imx/imx-wm8962.c +++ b/sound/soc/imx/imx-wm8962.c @@ -326,9 +326,9 @@ static int imx_wm8962_init(struct snd_soc_pcm_runtime *rtd) /* if amic is inserted, disable DMIC */ if (priv->amic_status != plat->mic_active_low) - snd_soc_dapm_nc_pin(&gcodec->dapm, "DMIC"); + snd_soc_dapm_nc_pin(&codec->dapm, "DMIC"); else - snd_soc_dapm_enable_pin(&gcodec->dapm, "DMIC"); + snd_soc_dapm_enable_pin(&codec->dapm, "DMIC"); } return 0; |