Modified: trunk/sound/soc/blackfin/bf5xx-ad193x.c (8727 => 8728)
--- trunk/sound/soc/blackfin/bf5xx-ad193x.c 2010-05-20 07:37:26 UTC (rev 8727)
+++ trunk/sound/soc/blackfin/bf5xx-ad193x.c 2010-05-21 03:40:49 UTC (rev 8728)
@@ -66,6 +66,13 @@
if (ret < 0)
return ret;
+#if 0
+ ret = snd_soc_dai_set_sysclk(codec_dai, 0, 24576000,
+ SND_SOC_CLOCK_IN);
+ if (ret < 0)
+ return ret;
+#endif
+
/* set codec DAI slots, 8 channels, all channels are enabled */
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xFF, 0xFF, 8, 32);
if (ret < 0)
@@ -77,13 +84,6 @@
if (ret < 0)
return ret;
-#if 0
- /* if input frequency is not 12288000, we need set pll */
- ret = snd_soc_dai_set_pll(codec_dai, 0, 0,
- 24576000, 12288000);
- if (ret < 0)
- return ret;
-#endif
return 0;
}
Modified: trunk/sound/soc/codecs/ad193x.c (8727 => 8728)
--- trunk/sound/soc/codecs/ad193x.c 2010-05-20 07:37:26 UTC (rev 8727)
+++ trunk/sound/soc/codecs/ad193x.c 2010-05-21 03:40:49 UTC (rev 8728)
@@ -23,6 +23,7 @@
/* codec private data */
struct ad193x_priv {
+ unsigned int sysclk;
struct snd_soc_codec codec;
u8 reg_cache[AD193X_NUM_REGS];
};
@@ -250,45 +251,32 @@
return 0;
}
-static int ad193x_set_dai_pll(struct snd_soc_dai *codec_dai,
- int pll_id, int source, unsigned int freq_in, unsigned int freq_out)
+static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
+ int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = codec_dai->codec;
- int reg;
-
- reg = snd_soc_read(codec, AD193X_PLL_CLK_CTRL0);
-
- switch (freq_in) {
+ struct ad193x_priv *ad193x = codec->private_data;
+ switch (freq) {
case 12288000:
- reg = (reg & AD193X_PLL_INPUT_MASK) | AD193X_PLL_INPUT_256;
- break;
case 18432000:
- reg = (reg & AD193X_PLL_INPUT_MASK) | AD193X_PLL_INPUT_384;
- break;
case 24576000:
- reg = (reg & AD193X_PLL_INPUT_MASK) | AD193X_PLL_INPUT_512;
- break;
case 36864000:
- reg = (reg & AD193X_PLL_INPUT_MASK) | AD193X_PLL_INPUT_768;
- break;
- default:
- dev_err(codec->dev, "ad193x_set_dai_pll: unsupported pll input freq:%d", freq_in);
- return -EINVAL;
+ ad193x->sysclk = freq;
+ return 0;
}
-
- snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg);
- return 0;
+ return -EINVAL;
}
static int ad193x_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
- int word_len = 0, reg = 0;
+ int word_len = 0, reg = 0, master_rate = 0;
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_device *socdev = rtd->socdev;
struct snd_soc_codec *codec = socdev->card->codec;
+ struct ad193x_priv *ad193x = codec->private_data;
/* bit size */
switch (params_format(params)) {
@@ -304,6 +292,25 @@
break;
}
+ switch (ad193x->sysclk) {
+ case 12288000:
+ master_rate = AD193X_PLL_INPUT_256;
+ break;
+ case 18432000:
+ master_rate = AD193X_PLL_INPUT_384;
+ break;
+ case 24576000:
+ master_rate = AD193X_PLL_INPUT_512;
+ break;
+ case 36864000:
+ master_rate = AD193X_PLL_INPUT_768;
+ break;
+ }
+
+ reg = snd_soc_read(codec, AD193X_PLL_CLK_CTRL0);
+ reg = (reg & AD193X_PLL_INPUT_MASK) | master_rate;
+ snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg);
+
reg = snd_soc_read(codec, AD193X_DAC_CTRL2);
reg = (reg & (~AD193X_DAC_WORD_LEN_MASK)) | word_len;
snd_soc_write(codec, AD193X_DAC_CTRL2, reg);
@@ -377,6 +384,7 @@
/* pll input: mclki/xi */
snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, 0x99); /* mclk=24.576Mhz: 0x9D; mclk=12.288Mhz: 0x99 */
snd_soc_write(codec, AD193X_PLL_CLK_CTRL1, 0x04);
+ ad193x->sysclk = 12288000;
ret = snd_soc_register_codec(codec);
if (ret != 0) {
@@ -412,8 +420,8 @@
.hw_params = ad193x_hw_params,
.digital_mute = ad193x_mute,
.set_tdm_slot = ad193x_set_tdm_slot,
+ .set_sysclk = ad193x_set_dai_sysclk,
.set_fmt = ad193x_set_dai_fmt,
- .set_pll = ad193x_set_dai_pll,
};
/* codec DAI instance */