summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2012-04-20 13:02:04 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2012-04-20 13:02:04 +0800
commitb0cf397cecdecc102b82fc844b7a9e098d841187 (patch)
tree681e410089711d7e8d13cd819004e698fa6fec14 /sound
parenteb1da050c08bb961a1e45dd51f97821d3eeb2ae9 (diff)
parenta7fbbad7276b41e8b338afafcaedf8c005de5c48 (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.c14
-rw-r--r--sound/soc/codecs/wm8962.c3
-rw-r--r--sound/soc/imx/imx-esai.c22
-rw-r--r--sound/soc/imx/imx-hdmi-dma.c35
-rw-r--r--sound/soc/imx/imx-ssi.c6
-rw-r--r--sound/soc/imx/imx-wm8962.c4
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;