summaryrefslogtreecommitdiff
path: root/sound/soc/mxs/mxs-dai.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/mxs/mxs-dai.c')
-rw-r--r--sound/soc/mxs/mxs-dai.c81
1 files changed, 56 insertions, 25 deletions
diff --git a/sound/soc/mxs/mxs-dai.c b/sound/soc/mxs/mxs-dai.c
index 04308d8d3127..e8c4642e660c 100644
--- a/sound/soc/mxs/mxs-dai.c
+++ b/sound/soc/mxs/mxs-dai.c
@@ -238,7 +238,7 @@ static int mxs_saif_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
u32 scr;
struct mxs_saif *saif_select = (struct mxs_saif *)cpu_dai->private_data;
- if (saif_select->saif_en == SAIF0)
+ if (saif_select->saif_clk == SAIF0)
scr = __raw_readl(SAIF0_CTRL);
else
scr = __raw_readl(SAIF1_CTRL);
@@ -293,7 +293,7 @@ static int mxs_saif_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
return -EINVAL;
}
- if (saif_select->saif_en == SAIF0)
+ if (saif_select->saif_clk == SAIF0)
__raw_writel(scr, SAIF0_CTRL);
else
__raw_writel(scr, SAIF1_CTRL);
@@ -310,18 +310,21 @@ static int mxs_saif_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
static int mxs_saif_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
{
u32 scr, stat;
+ u32 scr0, scr1;
struct mxs_saif *saif_select = (struct mxs_saif *)cpu_dai->private_data;
- if (saif_select->saif_en == SAIF0) {
- scr = __raw_readl(SAIF0_CTRL);
- stat = __raw_readl(SAIF0_STAT);
- } else {
- scr = __raw_readl(SAIF1_CTRL);
- stat = __raw_readl(SAIF1_STAT);
- }
+ stat = (__raw_readl(SAIF0_STAT)) | (__raw_readl(SAIF1_STAT));
if (stat & BM_SAIF_STAT_BUSY)
return 0;
+ scr0 = __raw_readl(SAIF0_CTRL);
+ scr1 = __raw_readl(SAIF1_CTRL);
+ scr0 = scr0 & ~BM_SAIF_CTRL_BITCLK_EDGE & ~BM_SAIF_CTRL_LRCLK_POLARITY \
+ & ~BM_SAIF_CTRL_JUSTIFY & ~BM_SAIF_CTRL_DELAY;
+ scr1 = scr1 & ~BM_SAIF_CTRL_BITCLK_EDGE & ~BM_SAIF_CTRL_LRCLK_POLARITY \
+ & ~BM_SAIF_CTRL_JUSTIFY & ~BM_SAIF_CTRL_DELAY;
+ scr = 0;
+
/* DAI mode */
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S:
@@ -360,20 +363,25 @@ static int mxs_saif_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
/* DAI clock master masks */
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBS_CFS:
- scr &= ~BM_SAIF_CTRL_SLAVE_MODE;
break;
case SND_SOC_DAIFMT_CBM_CFS:
break;
case SND_SOC_DAIFMT_CBS_CFM:
break;
case SND_SOC_DAIFMT_CBM_CFM:
- scr |= BM_SAIF_CTRL_SLAVE_MODE;
+ if (saif_select->saif_clk == SAIF0) {
+ scr &= ~BM_SAIF_CTRL_SLAVE_MODE;
+ __raw_writel(scr | scr0, SAIF0_CTRL);
+ scr |= BM_SAIF_CTRL_SLAVE_MODE;
+ __raw_writel(scr | scr1, SAIF1_CTRL);
+ } else {
+ scr &= ~BM_SAIF_CTRL_SLAVE_MODE;
+ __raw_writel(scr | scr1, SAIF1_CTRL);
+ scr |= BM_SAIF_CTRL_SLAVE_MODE;
+ __raw_writel(scr | scr0, SAIF0_CTRL);
+ }
break;
}
- if (saif_select->saif_en == SAIF0)
- __raw_writel(scr, SAIF0_CTRL);
- else
- __raw_writel(scr, SAIF1_CTRL);
SAIF_DUMP();
return 0;
@@ -396,10 +404,16 @@ static int mxs_saif_startup(struct snd_pcm_substream *substream,
if (cpu_dai->playback.active && cpu_dai->capture.active)
return 0;
- if (saif_select->saif_en == SAIF0)
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE)))
if (saif_active[SAIF0_PORT]++)
return 0;
- if (saif_select->saif_en == SAIF1)
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_CAPTURE)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)))
if (saif_active[SAIF1_PORT]++)
return 0;
SAIF_DUMP();
@@ -416,7 +430,10 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
{
u32 scr, stat;
struct mxs_saif *saif_select = (struct mxs_saif *)cpu_dai->private_data;
- if (saif_select->saif_en == SAIF0) {
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE))) {
scr = __raw_readl(SAIF0_CTRL);
stat = __raw_readl(SAIF0_STAT);
} else {
@@ -449,7 +466,10 @@ static int mxs_saif_hw_params(struct snd_pcm_substream *substream,
scr |= BM_SAIF_CTRL_READ_MODE;
}
- if (saif_select->saif_en == SAIF0)
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE)))
__raw_writel(scr, SAIF0_CTRL);
else
__raw_writel(scr, SAIF1_CTRL);
@@ -460,7 +480,10 @@ static int mxs_saif_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *cpu_dai)
{
struct mxs_saif *saif_select = (struct mxs_saif *)cpu_dai->private_data;
- if (saif_select->saif_en == SAIF0)
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE)))
__raw_writel(BM_SAIF_CTRL_CLKGATE, SAIF0_CTRL_CLR);
else
__raw_writel(BM_SAIF_CTRL_CLKGATE, SAIF1_CTRL_CLR);
@@ -478,7 +501,10 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
- if (saif_select->saif_en == SAIF0)
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE)))
reg = (void __iomem *)SAIF0_DATA;
else
reg = (void __iomem *)SAIF1_DATA;
@@ -511,14 +537,19 @@ static void mxs_saif_shutdown(struct snd_pcm_substream *substream,
if (cpu_dai->playback.active || cpu_dai->capture.active)
return;
- if (saif_select->saif_en == SAIF0) {
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_CAPTURE)))
if (--saif_active[SAIF0_PORT] > 1)
return;
- }
- if (saif_select->saif_en == SAIF1) {
+
+ if (((saif_select->stream_mapping == PLAYBACK_SAIF0_CAPTURE_SAIF1) && \
+ (substream->stream == SNDRV_PCM_STREAM_CAPTURE)) || \
+ ((saif_select->stream_mapping == PLAYBACK_SAIF1_CAPTURE_SAIF0) \
+ && (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)))
if (--saif_active[SAIF1_PORT])
return;
- }
}
#ifdef CONFIG_PM