1

ASoC: SOF: Intel: hda: refactoring topology name fixup for HDA mach

Move I2S mach's topology name fixup code to the end of machine driver
enumeration flow so HDA mach could also use same code to fixup its
topology file name as well. No functional change in this commit.

Signed-off-by: Brent Lu <brent.lu@intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://patch.msgid.link/20240827123215.258859-5-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Bard Liao 2024-08-27 20:32:02 +08:00 committed by Mark Brown
parent 14e91ddd5c
commit 5458411d75
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
2 changed files with 45 additions and 51 deletions

View File

@ -13,16 +13,8 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_hda_machines[] = {
{ {
/* .id is not used in this file */ /* .id is not used in this file */
.drv_name = "skl_hda_dsp_generic", .drv_name = "skl_hda_dsp_generic",
.sof_tplg_filename = "sof-hda-generic", /* the tplg suffix is added at run time */
/* .fw_filename is dynamically set in skylake driver */ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
.sof_tplg_filename = "sof-hda-generic.tplg",
/*
* .machine_quirk and .quirk_data are not used here but
* can be used if we need a more complicated machine driver
* combining HDA+other device (e.g. DMIC).
*/
}, },
{}, {},
}; };

View File

@ -558,7 +558,7 @@ static int check_nhlt_ssp_mclk_mask(struct snd_sof_dev *sdev, int ssp_num)
return intel_nhlt_ssp_mclk_mask(nhlt, ssp_num); return intel_nhlt_ssp_mclk_mask(nhlt, ssp_num);
} }
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC) || IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE) #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
static const char *fixup_tplg_name(struct snd_sof_dev *sdev, static const char *fixup_tplg_name(struct snd_sof_dev *sdev,
const char *sof_tplg_filename, const char *sof_tplg_filename,
@ -1045,10 +1045,7 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev,
struct snd_soc_acpi_mach *hda_mach; struct snd_soc_acpi_mach *hda_mach;
struct snd_sof_pdata *pdata = sdev->pdata; struct snd_sof_pdata *pdata = sdev->pdata;
const char *tplg_filename; const char *tplg_filename;
const char *idisp_str;
int dmic_num = 0;
int codec_num = 0; int codec_num = 0;
int ret;
int i; int i;
/* codec detection */ /* codec detection */
@ -1071,33 +1068,30 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev,
* - one external HDAudio codec * - one external HDAudio codec
*/ */
if (!*mach && codec_num <= 2) { if (!*mach && codec_num <= 2) {
bool tplg_fixup; bool tplg_fixup = false;
hda_mach = snd_soc_acpi_intel_hda_machines; hda_mach = snd_soc_acpi_intel_hda_machines;
dev_info(bus->dev, "using HDA machine driver %s now\n", dev_info(bus->dev, "using HDA machine driver %s now\n",
hda_mach->drv_name); hda_mach->drv_name);
if (codec_num == 1 && HDA_IDISP_CODEC(bus->codec_mask)) /*
idisp_str = "-idisp"; * topology: use the info from hda_machines since tplg file name
else * is not overwritten
idisp_str = ""; */
if (!pdata->tplg_filename)
/* topology: use the info from hda_machines */
if (pdata->tplg_filename) {
tplg_fixup = false;
tplg_filename = pdata->tplg_filename;
} else {
tplg_fixup = true; tplg_fixup = true;
tplg_filename = hda_mach->sof_tplg_filename;
}
ret = dmic_detect_topology_fixup(sdev, &tplg_filename, idisp_str, &dmic_num,
tplg_fixup);
if (ret < 0)
return;
hda_mach->mach_params.dmic_num = dmic_num; if (tplg_fixup &&
pdata->tplg_filename = tplg_filename; codec_num == 1 && HDA_IDISP_CODEC(bus->codec_mask)) {
tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
"%s-idisp",
hda_mach->sof_tplg_filename);
if (!tplg_filename)
return;
hda_mach->sof_tplg_filename = tplg_filename;
}
if (codec_num == 2 || if (codec_num == 2 ||
(codec_num == 1 && !HDA_IDISP_CODEC(bus->codec_mask))) { (codec_num == 1 && !HDA_IDISP_CODEC(bus->codec_mask))) {
@ -1311,11 +1305,35 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
const char *tplg_filename; const char *tplg_filename;
const char *tplg_suffix; const char *tplg_suffix;
bool amp_name_valid; bool amp_name_valid;
bool i2s_mach_found = false;
/* Try I2S or DMIC if it is supported */ /* Try I2S or DMIC if it is supported */
if (interface_mask & (BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC))) if (interface_mask & (BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC))) {
mach = snd_soc_acpi_find_machine(desc->machines); mach = snd_soc_acpi_find_machine(desc->machines);
if (mach)
i2s_mach_found = true;
}
/*
* If I2S fails and no external HDaudio codec is detected,
* try SoundWire if it is supported
*/
if (!mach && !HDA_EXT_CODEC(bus->codec_mask) &&
(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
mach = hda_sdw_machine_select(sdev);
/*
* Choose HDA generic machine driver if mach is NULL.
* Otherwise, set certain mach params.
*/
hda_generic_machine_select(sdev, &mach);
if (!mach)
dev_warn(sdev->dev, "warning: No matching ASoC machine driver found\n");
/*
* Fixup tplg file name by appending dmic num, ssp num, codec/amplifier
* name string if quirk flag is set.
*/
if (mach) { if (mach) {
bool add_extension = false; bool add_extension = false;
bool tplg_fixup = false; bool tplg_fixup = false;
@ -1349,7 +1367,7 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL, tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
"%s%s%d%s", "%s%s%d%s",
sof_pdata->tplg_filename, sof_pdata->tplg_filename,
"-dmic", i2s_mach_found ? "-dmic" : "-",
mach->mach_params.dmic_num, mach->mach_params.dmic_num,
"ch"); "ch");
if (!tplg_filename) if (!tplg_filename)
@ -1479,22 +1497,6 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
} }
} }
/*
* If I2S fails and no external HDaudio codec is detected,
* try SoundWire if it is supported
*/
if (!mach && !HDA_EXT_CODEC(bus->codec_mask) &&
(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
mach = hda_sdw_machine_select(sdev);
/*
* Choose HDA generic machine driver if mach is NULL.
* Otherwise, set certain mach params.
*/
hda_generic_machine_select(sdev, &mach);
if (!mach)
dev_warn(sdev->dev, "warning: No matching ASoC machine driver found\n");
return mach; return mach;
} }