Loading Documentation/devicetree/bindings/sound/simple-card.txt +5 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,8 @@ Optional properties: connection's sink, the second being the connection's source. - simple-audio-card,mclk-fs : Multiplication factor between stream rate and codec mclk. mclk. When defined, mclk-fs property defined in dai-link sub nodes are ignored. - simple-audio-card,hp-det-gpio : Reference to GPIO that signals when headphones are attached. - simple-audio-card,mic-det-gpio : Reference to GPIO that signals when Loading Loading @@ -55,6 +56,9 @@ Optional dai-link subnode properties: dai-link uses bit clock inversion. - frame-inversion : bool property. Add this if the dai-link uses frame clock inversion. - mclk-fs : Multiplication factor between stream rate and codec mclk, applied only for the dai-link. For backward compatibility the frame-master and bitclock-master properties can be used as booleans in codec subnode to indicate if the Loading sound/soc/generic/simple-card.c +15 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ struct simple_card_data { struct simple_dai_props { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; int gpio_hp_det; Loading Loading @@ -76,11 +77,18 @@ 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; struct simple_dai_props *dai_props = &priv->dai_props[rtd - rtd->card->rtd]; unsigned int mclk, mclk_fs = 0; int ret = 0; if (priv->mclk_fs) { mclk = params_rate(params) * priv->mclk_fs; if (priv->mclk_fs) mclk_fs = priv->mclk_fs; else if (dai_props->mclk_fs) mclk_fs = dai_props->mclk_fs; if (mclk_fs) { mclk = params_rate(params) * mclk_fs; ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk, SND_SOC_CLOCK_IN); } Loading Loading @@ -313,6 +321,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, char prop[128]; char *prefix = ""; int ret, cpu_args; u32 val; /* For single DAI link & old style of DT node */ if (is_top_level_node) Loading @@ -338,6 +347,9 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, if (ret < 0) goto dai_link_of_err; if (!of_property_read_u32(node, "mclk-fs", &val)) dai_props->mclk_fs = val; ret = asoc_simple_card_sub_parse_of(cpu, &dai_props->cpu_dai, &dai_link->cpu_of_node, &dai_link->cpu_dai_name, Loading Loading
Documentation/devicetree/bindings/sound/simple-card.txt +5 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,8 @@ Optional properties: connection's sink, the second being the connection's source. - simple-audio-card,mclk-fs : Multiplication factor between stream rate and codec mclk. mclk. When defined, mclk-fs property defined in dai-link sub nodes are ignored. - simple-audio-card,hp-det-gpio : Reference to GPIO that signals when headphones are attached. - simple-audio-card,mic-det-gpio : Reference to GPIO that signals when Loading Loading @@ -55,6 +56,9 @@ Optional dai-link subnode properties: dai-link uses bit clock inversion. - frame-inversion : bool property. Add this if the dai-link uses frame clock inversion. - mclk-fs : Multiplication factor between stream rate and codec mclk, applied only for the dai-link. For backward compatibility the frame-master and bitclock-master properties can be used as booleans in codec subnode to indicate if the Loading
sound/soc/generic/simple-card.c +15 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ struct simple_card_data { struct simple_dai_props { struct asoc_simple_dai cpu_dai; struct asoc_simple_dai codec_dai; unsigned int mclk_fs; } *dai_props; unsigned int mclk_fs; int gpio_hp_det; Loading Loading @@ -76,11 +77,18 @@ 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; struct simple_dai_props *dai_props = &priv->dai_props[rtd - rtd->card->rtd]; unsigned int mclk, mclk_fs = 0; int ret = 0; if (priv->mclk_fs) { mclk = params_rate(params) * priv->mclk_fs; if (priv->mclk_fs) mclk_fs = priv->mclk_fs; else if (dai_props->mclk_fs) mclk_fs = dai_props->mclk_fs; if (mclk_fs) { mclk = params_rate(params) * mclk_fs; ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk, SND_SOC_CLOCK_IN); } Loading Loading @@ -313,6 +321,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, char prop[128]; char *prefix = ""; int ret, cpu_args; u32 val; /* For single DAI link & old style of DT node */ if (is_top_level_node) Loading @@ -338,6 +347,9 @@ static int asoc_simple_card_dai_link_of(struct device_node *node, if (ret < 0) goto dai_link_of_err; if (!of_property_read_u32(node, "mclk-fs", &val)) dai_props->mclk_fs = val; ret = asoc_simple_card_sub_parse_of(cpu, &dai_props->cpu_dai, &dai_link->cpu_of_node, &dai_link->cpu_dai_name, Loading