switch (cpu_dai->id) { case PRIMARY_MI2S_RX: case PRIMARY_MI2S_TX: /* * Use ASRC for internal clocks, as PLL rate isn't multiple * of BCLK.
*/
rt5663_sel_asrc_clk_src(
codec_dai->component,
RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
RT5663_CLK_SEL_I2S1_ASRC);
ret = snd_soc_dai_set_sysclk(
codec_dai, RT5663_SCLK_S_MCLK, DEFAULT_MCLK_RATE,
SND_SOC_CLOCK_IN); if (ret < 0)
dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret); break; case QUATERNARY_TDM_RX_0: case QUATERNARY_TDM_TX_0:
ret = sdm845_tdm_snd_hw_params(substream, params); break; case SLIMBUS_0_RX...SLIMBUS_6_TX:
ret = sdm845_slim_snd_hw_params(substream, params); break; case QUATERNARY_MI2S_RX: case SECONDARY_MI2S_RX: break; default:
pr_err("%s: invalid dai id 0x%x\n", __func__, cpu_dai->id); break;
} return ret;
}
switch (cpu_dai->id) { case PRIMARY_MI2S_RX:
jack = pdata->jack.jack;
component = codec_dai->component;
jack->private_data = component;
jack->private_free = sdm845_jack_free;
rval = snd_soc_component_set_jack(component,
&pdata->jack, NULL); if (rval != 0 && rval != -ENOTSUPP) {
dev_warn(card->dev, "Failed to set jack: %d\n", rval); return rval;
} break; case SLIMBUS_0_RX...SLIMBUS_6_TX: /* setting up wcd multiple times for slim port is redundant */ if (pdata->slim_port_setup || !link->no_pcm) return0;
switch (cpu_dai->id) { case PRIMARY_MI2S_RX: case PRIMARY_MI2S_TX:
codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF; if (++(data->pri_mi2s_clk_count) == 1) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_MCLK_1,
DEFAULT_MCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
}
snd_soc_dai_set_fmt(cpu_dai, fmt);
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break;
case SECONDARY_MI2S_RX: case SECONDARY_MI2S_TX:
codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; if (++(data->sec_mi2s_clk_count) == 1) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_CAPTURE);
}
snd_soc_dai_set_fmt(cpu_dai, fmt);
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUATERNARY_MI2S_RX:
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
snd_soc_dai_set_fmt(cpu_dai, fmt); break;
case QUATERNARY_TDM_RX_0: case QUATERNARY_TDM_TX_0: if (++(data->quat_tdm_clk_count) == 1) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT,
TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
}
switch (cpu_dai->id) { case PRIMARY_MI2S_RX: case PRIMARY_MI2S_TX: if (--(data->pri_mi2s_clk_count) == 0) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_MCLK_1, 0, SNDRV_PCM_STREAM_PLAYBACK);
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, 0, SNDRV_PCM_STREAM_PLAYBACK);
} break;
case SECONDARY_MI2S_RX: case SECONDARY_MI2S_TX: if (--(data->sec_mi2s_clk_count) == 0) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, 0, SNDRV_PCM_STREAM_CAPTURE);
} break;
case QUATERNARY_TDM_RX_0: case QUATERNARY_TDM_TX_0: if (--(data->quat_tdm_clk_count) == 0) {
snd_soc_dai_set_sysclk(cpu_dai,
Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, 0, SNDRV_PCM_STREAM_PLAYBACK);
} break; case SLIMBUS_0_RX...SLIMBUS_6_TX: case QUATERNARY_MI2S_RX: break;
default:
pr_err("%s: invalid dai id 0x%x\n", __func__, cpu_dai->id); break;
}
if (data->stream_prepared[cpu_dai->id]) {
sdw_disable_stream(sruntime);
sdw_deprepare_stream(sruntime);
data->stream_prepared[cpu_dai->id] = false;
}
ret = sdw_prepare_stream(sruntime); if (ret) return ret;
/** * NOTE: there is a strict hw requirement about the ordering of port * enables and actual WSA881x PA enable. PA enable should only happen * after soundwire ports are enabled if not DC on the line is * accumulated resulting in Click/Pop Noise * PA enable/mute are handled as part of codec DAPM and digital mute.
*/
ret = sdw_enable_stream(sruntime); if (ret) {
sdw_deprepare_stream(sruntime); return ret;
}
data->stream_prepared[cpu_dai->id] = true;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.