Hi Max
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index cef7776..abef5ed 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -43,6 +44,22 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream, SND_SOC_CLOCK_IN); }
switch (params_rate(params)) {case 48000:case 32000:case 16000:case 8000:ret = snd_soc_dai_set_sysclk(codec_dai, 0, 12288000,SND_SOC_CLOCK_IN);break;case 44100:case 22050:case 11025:ret = snd_soc_dai_set_sysclk(codec_dai, 0, 11289600,SND_SOC_CLOCK_IN);break;} return ret;}
but that's of course not a solution. So my question is is there any way I can subclass or inherit from the simple audio card driver to add such functionality to it?
Current simple-card already has mclk_fs support on hw_param. So, we can add similar method ? Below is my idea. priv->xxx is new option here. Or you can update mclk_fs feature somehow ?
-------------- diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c index 4f192ee..5d943a1 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -43,14 +43,21 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream, struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); - unsigned int mclk; + unsigned int mclk = 0; int ret = 0;
if (priv->mclk_fs) { mclk = params_rate(params) * priv->mclk_fs; + } else if (priv->xxx) { + if (0 == (12288000 % params_rate(params))) + mclk = 12288000; + if (0 == (11289600 % params_rate(params))) + mclk = 11289600; + } + + if (mclk) ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk, SND_SOC_CLOCK_IN); - }
return ret; } --------------
Best regards --- Kuninori Morimoto