ret = snd_soc_dapm_new_controls(&card->dapm, cs35l41_dapm_widgets,
ARRAY_SIZE(cs35l41_dapm_widgets)); if (ret) {
dev_err(rtd->dev, "fail to add dapm controls, ret %d\n", ret); return ret;
}
ret = snd_soc_add_card_controls(card, cs35l41_kcontrols,
ARRAY_SIZE(cs35l41_kcontrols)); if (ret) {
dev_err(rtd->dev, "fail to add card controls, ret %d\n", ret); return ret;
}
ret = snd_soc_dapm_add_routes(&card->dapm, cs35l41_dapm_routes,
ARRAY_SIZE(cs35l41_dapm_routes));
if (ret)
dev_err(rtd->dev, "fail to add dapm routes, ret %d\n", ret);
staticint cs35l41_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params)
{ struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); struct snd_soc_dai *codec_dai; int clk_freq, i, ret;
clk_freq = sof_dai_get_bclk(rtd); /* BCLK freq */
if (clk_freq <= 0) {
dev_err(rtd->dev, "fail to get bclk freq, ret %d\n", clk_freq); return -EINVAL;
}
for_each_rtd_codec_dais(rtd, i, codec_dai) { /* call dai driver's set_sysclk() callback */
ret = snd_soc_dai_set_sysclk(codec_dai, CS35L41_CLKID_SCLK,
clk_freq, SND_SOC_CLOCK_IN); if (ret < 0) {
dev_err(codec_dai->dev, "fail to set sysclk, ret %d\n",
ret); return ret;
}
/* call component driver's set_sysclk() callback */
ret = snd_soc_component_set_sysclk(codec_dai->component,
CS35L41_CLKID_SCLK, 0,
clk_freq, SND_SOC_CLOCK_IN); if (ret < 0) {
dev_err(codec_dai->dev, "fail to set component sysclk, ret %d\n",
ret); return ret;
}
/* setup channel map */
ret = snd_soc_dai_set_channel_map(codec_dai, 0, NULL,
ARRAY_SIZE(cs35l41_channel_map[i].rx),
(unsignedint *)cs35l41_channel_map[i].rx); if (ret < 0) {
dev_err(codec_dai->dev, "fail to set channel map, ret %d\n",
ret); return ret;
}
}
/* * Expected UIDs are integers (stored as strings). * UID Mapping is fixed: * UID 0x0 -> WL * UID 0x1 -> WR * UID 0x2 -> TL * UID 0x3 -> TR * Note: If there are less than 4 Amps, UIDs still map to WL/WR/TL/TR. Dynamic code will only create * dai links for UIDs which exist, and ignore non-existant ones. Only 2 or 4 amps are expected. * Return number of codecs found.
*/ staticint cs35l41_compute_codec_conf(void)
{ staticconstchar * const uid_strings[] = { "0", "1", "2", "3" }; unsignedint uid, sz = 0; struct acpi_device *adev; struct device *physdev;