Skip to content

Commit

Permalink
ASoC: Intel: sof_sdw: add common sdw dai link init
Browse files Browse the repository at this point in the history
Currently, we set sdw dai link .init callback in the codec_info_list's
dais.init function. This works fine if all codecs in the dai link are
the same. However, we need to do all the .init stuff for all different
codecs in the dai link if not all codecs in the dai link are the same.
Use a common dai link .init callback to call the new rtd_init callback
in sof_sdw_dai_info{} to do rtd_init for each dai.
Some codec init callback will become empty after this change. They will
be removed in the follow up patch.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
  • Loading branch information
bardliao committed Dec 13, 2023
1 parent fdc334a commit 02adad0
Show file tree
Hide file tree
Showing 14 changed files with 108 additions and 40 deletions.
75 changes: 74 additions & 1 deletion sound/soc/intel/boards/sof_sdw.c
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_JACK,
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt700_init,
.rtd_init = rt700_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -676,6 +677,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt_sdca_jack_init,
.exit = sof_sdw_rt_sdca_jack_exit,
.rtd_init = rt_sdca_jack_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -691,6 +693,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt711_init,
.exit = sof_sdw_rt711_exit,
.rtd_init = rt711_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -706,13 +709,15 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt_sdca_jack_init,
.exit = sof_sdw_rt_sdca_jack_exit,
.rtd_init = rt_sdca_jack_rtd_init,
},
{
.direction = {true, false},
.dai_name = "rt712-sdca-aif2",
.dai_type = SOF_SDW_DAI_TYPE_AMP,
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID},
.init = sof_sdw_rt712_spk_init,
.rtd_init = rt712_spk_rtd_init,
},
},
.dai_num = 2,
Expand All @@ -727,6 +732,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt712_sdca_dmic_init,
.rtd_init = rt712_sdca_dmic_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -742,6 +748,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt_sdca_jack_init,
.exit = sof_sdw_rt_sdca_jack_exit,
.rtd_init = rt_sdca_jack_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -756,6 +763,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt712_sdca_dmic_init,
.rtd_init = rt712_sdca_dmic_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -771,6 +779,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID},
.init = sof_sdw_rt_amp_init,
.exit = sof_sdw_rt_amp_exit,
.rtd_init = rt_amp_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -786,6 +795,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID},
.init = sof_sdw_rt_amp_init,
.exit = sof_sdw_rt_amp_exit,
.rtd_init = rt_amp_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -800,6 +810,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID},
.init = sof_sdw_rt_amp_init,
.exit = sof_sdw_rt_amp_exit,
.rtd_init = rt_amp_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -815,6 +826,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt715_sdca_init,
.rtd_init = rt715_sdca_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -830,6 +842,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt715_sdca_init,
.rtd_init = rt715_sdca_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -845,6 +858,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt715_init,
.rtd_init = rt715_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -860,6 +874,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_rt715_init,
.rtd_init = rt715_rtd_init,
},
},
.dai_num = 1,
Expand Down Expand Up @@ -903,6 +918,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_AMP,
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID},
.init = sof_sdw_maxim_init,
.rtd_init = maxim_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -916,6 +932,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_AMP,
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID},
.init = sof_sdw_maxim_init,
.rtd_init = maxim_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -929,6 +946,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_JACK,
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_rt5682_init,
.rtd_init = rt5682_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -942,6 +960,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_AMP,
.dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID},
.init = sof_sdw_cs_amp_init,
.rtd_init = cs_spk_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -955,6 +974,7 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_JACK,
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID},
.init = sof_sdw_cs42l42_init,
.rtd_init = cs42l42_rtd_init,
},
},
.dai_num = 1,
Expand All @@ -969,13 +989,15 @@ static struct sof_sdw_codec_info codec_info_list[] = {
.dai_type = SOF_SDW_DAI_TYPE_JACK,
.dailink = {SDW_JACK_OUT_DAI_ID, SDW_UNUSED_DAI_ID},
.init = sof_sdw_cs42l43_hs_init,
.rtd_init = cs42l43_hs_rtd_init,
},
{
.direction = {false, true},
.dai_name = "cs42l43-dp1",
.dai_type = SOF_SDW_DAI_TYPE_MIC,
.dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID},
.init = sof_sdw_cs42l43_dmic_init,
.rtd_init = cs42l43_dmic_rtd_init,
},
{
.direction = {false, true},
Expand Down Expand Up @@ -1397,6 +1419,56 @@ static void set_dailink_map(struct snd_soc_dai_link_ch_map *sdw_codec_ch_maps,
}
}

static inline int find_codec_info_dai(const char *dai_name, int *dai_index)
{
int i, j;

for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
for (j = 0; j < codec_info_list[i].dai_num; j++) {
if (!strcmp(codec_info_list[i].dais[j].dai_name, dai_name)) {
*dai_index = j;
return i;
}
}
}

return -EINVAL;
}

static int sof_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct sof_sdw_codec_info *codec_info;
struct snd_soc_dai *dai;
int codec_index;
int dai_index;
int ret;
int i;

for_each_rtd_codec_dais(rtd, i, dai) {
codec_index = find_codec_info_dai(dai->name, &dai_index);
if (codec_index < 0)
return -EINVAL;

codec_info = &codec_info_list[codec_index];
/*
* A codec dai can be connected to different dai links for capture and playback,
* but we only need to call the rtd_init function once.
* The rtd_init for each codec dai is independent. So, the order of rtd_init
* doesn't matter.
*/
if (codec_info->dais[dai_index].rtd_init_done)
continue;
if (codec_info->dais[dai_index].rtd_init) {
ret = codec_info->dais[dai_index].rtd_init(rtd);
if (ret)
return ret;
}
codec_info->dais[dai_index].rtd_init_done = true;
}

return 0;
}

static const char * const type_strings[] = {"SimpleJack", "SmartAmp", "SmartMic"};

static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,
Expand Down Expand Up @@ -1557,7 +1629,7 @@ static int create_sdw_dailink(struct snd_soc_card *card, int *link_index,

init_dai_link(dev, dai_links + *link_index, be_id, name,
playback, capture, cpus, cpu_dai_num, codecs, codec_num,
NULL, &sdw_ops);
sof_sdw_rtd_init, &sdw_ops);

/*
* SoundWire DAILINKs use 'stream' functions and Bank Switch operations
Expand Down Expand Up @@ -1890,6 +1962,7 @@ static void mc_dailink_exit_loop(struct snd_soc_card *card)

for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) {
for (j = 0; j < codec_info_list[i].dai_num; j++) {
codec_info_list[i].dais[j].rtd_init_done = false;
/* Check each dai in codec_info_lis to see if it is used in the link */
if (!codec_info_list[i].dais[j].exit)
continue;
Expand Down
20 changes: 20 additions & 0 deletions sound/soc/intel/boards/sof_sdw_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ struct sof_sdw_dai_info {
struct sof_sdw_codec_info *info,
bool playback);
int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link);
int (*rtd_init)(struct snd_soc_pcm_runtime *rtd);
bool rtd_init_done; /* Indicate that the rtd_init callback is done */
};

struct sof_sdw_codec_info {
Expand Down Expand Up @@ -235,4 +237,22 @@ int sof_sdw_cs_amp_init(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_links,
struct sof_sdw_codec_info *info,
bool playback);

/* dai_link init callbacks */

int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd);
int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd);
int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd);
int cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd);
int maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt700_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt712_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt712_spk_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt715_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt715_sdca_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd);
int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd);

#endif
4 changes: 1 addition & 3 deletions sound/soc/intel/boards/sof_sdw_cs42l42.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ static const char * const jack_codecs[] = {
"cs42l42"
};

static int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd)
int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
struct mc_private *ctx = snd_soc_card_get_drvdata(card);
Expand Down Expand Up @@ -135,8 +135,6 @@ int sof_sdw_cs42l42_init(struct snd_soc_card *card,
if (!playback)
return 0;

dai_links->init = cs42l42_rtd_init;

return 0;
}
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_BOARD_HELPERS);
7 changes: 2 additions & 5 deletions sound/soc/intel/boards/sof_sdw_cs42l43.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static struct snd_soc_jack_pin sof_jack_pins[] = {
},
};

static int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd)
int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
struct mc_private *ctx = snd_soc_card_get_drvdata(rtd->card);
Expand Down Expand Up @@ -116,12 +116,11 @@ int sof_sdw_cs42l43_hs_init(struct snd_soc_card *card, const struct snd_soc_acpi
* No need to test if (!playback) like other codecs as cs42l43 uses separated dai for
* playback and capture, and sof_sdw_cs42l43_init is only linked to the playback dai.
*/
dai_links->init = cs42l43_hs_rtd_init;

return 0;
}

static int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd)
int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
int ret;
Expand Down Expand Up @@ -150,7 +149,5 @@ int sof_sdw_cs42l43_dmic_init(struct snd_soc_card *card, const struct snd_soc_ac
struct snd_soc_dai_link *dai_links, struct sof_sdw_codec_info *info,
bool playback)
{
dai_links->init = cs42l43_dmic_rtd_init;

return 0;
}
3 changes: 1 addition & 2 deletions sound/soc/intel/boards/sof_sdw_cs_amp.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#define CODEC_NAME_SIZE 8

static int cs_spk_init(struct snd_soc_pcm_runtime *rtd)
int cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
const char *dai_name = rtd->dai_link->codecs->dai_name;
struct snd_soc_card *card = rtd->card;
Expand Down Expand Up @@ -41,7 +41,6 @@ int sof_sdw_cs_amp_init(struct snd_soc_card *card,
return 0;

info->amp_num++;
dai_links->init = cs_spk_init;

return 0;
}
4 changes: 1 addition & 3 deletions sound/soc/intel/boards/sof_sdw_maxim.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static const struct snd_kcontrol_new maxim_controls[] = {
SOC_DAPM_PIN_SWITCH("Right Spk"),
};

static int spk_init(struct snd_soc_pcm_runtime *rtd)
int maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
int ret;
Expand Down Expand Up @@ -145,8 +145,6 @@ int sof_sdw_maxim_init(struct snd_soc_card *card,
bool playback)
{
info->amp_num++;
if (info->amp_num == 2)
dai_links->init = spk_init;

maxim_part_id = info->part_id;
switch (maxim_part_id) {
Expand Down
4 changes: 1 addition & 3 deletions sound/soc/intel/boards/sof_sdw_rt5682.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static const char * const jack_codecs[] = {
"rt5682"
};

static int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd)
int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
struct mc_private *ctx = snd_soc_card_get_drvdata(card);
Expand Down Expand Up @@ -134,8 +134,6 @@ int sof_sdw_rt5682_init(struct snd_soc_card *card,
if (!playback)
return 0;

dai_links->init = rt5682_rtd_init;

return 0;
}
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_BOARD_HELPERS);
Loading

0 comments on commit 02adad0

Please sign in to comment.