|
@@ -68,6 +68,8 @@ struct i2s_dai {
|
|
|
#define DAI_OPENED (1 << 0) /* Dai is opened */
|
|
|
#define DAI_MANAGER (1 << 1) /* Dai is the manager */
|
|
|
unsigned mode;
|
|
|
+ /* CDCLK pin direction: 0 - input, 1 - output */
|
|
|
+ unsigned int cdclk_out:1;
|
|
|
/* Driver for this DAI */
|
|
|
struct snd_soc_dai_driver i2s_dai_drv;
|
|
|
/* DMA parameters */
|
|
@@ -737,6 +739,9 @@ static int i2s_startup(struct snd_pcm_substream *substream,
|
|
|
|
|
|
spin_unlock_irqrestore(&lock, flags);
|
|
|
|
|
|
+ if (!is_opened(other) && i2s->cdclk_out)
|
|
|
+ i2s_set_sysclk(dai, SAMSUNG_I2S_CDCLK,
|
|
|
+ 0, SND_SOC_CLOCK_OUT);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -752,9 +757,13 @@ static void i2s_shutdown(struct snd_pcm_substream *substream,
|
|
|
i2s->mode &= ~DAI_OPENED;
|
|
|
i2s->mode &= ~DAI_MANAGER;
|
|
|
|
|
|
- if (is_opened(other))
|
|
|
+ if (is_opened(other)) {
|
|
|
other->mode |= DAI_MANAGER;
|
|
|
-
|
|
|
+ } else {
|
|
|
+ u32 mod = readl(i2s->addr + I2SMOD);
|
|
|
+ i2s->cdclk_out = !(mod & MOD_CDCLKCON);
|
|
|
+ other->cdclk_out = i2s->cdclk_out;
|
|
|
+ }
|
|
|
/* Reset any constraint on RFS and BFS */
|
|
|
i2s->rfs = 0;
|
|
|
i2s->bfs = 0;
|