ASoC: SOF: Intel: hda: retrieve DMIC number for I2S boards
We currently extract the DMIC number only for HDaudio or SoundWire platforms. For I2S/TDM platforms, this wasn't necessary until now, but with devices with ES8336 we need to find a solution to detect dmics more reliably than with a DMI quirk. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20220308192610.392950-4-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
679aa83a0f
commit
92c1b7c0f7
|
@ -432,11 +432,9 @@ static char *hda_model;
|
|||
module_param(hda_model, charp, 0444);
|
||||
MODULE_PARM_DESC(hda_model, "Use the given HDA board model.");
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) || IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
|
||||
static int hda_dmic_num = -1;
|
||||
module_param_named(dmic_num, hda_dmic_num, int, 0444);
|
||||
static int dmic_num_override = -1;
|
||||
module_param_named(dmic_num, dmic_num_override, int, 0444);
|
||||
MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number");
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
static bool hda_codec_use_common_hdmi = IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI);
|
||||
|
@ -644,24 +642,35 @@ static int hda_init(struct snd_sof_dev *sdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) || IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
|
||||
|
||||
static int check_nhlt_dmic(struct snd_sof_dev *sdev)
|
||||
static int check_dmic_num(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct nhlt_acpi_table *nhlt;
|
||||
int dmic_num;
|
||||
int dmic_num = 0;
|
||||
|
||||
nhlt = intel_nhlt_init(sdev->dev);
|
||||
if (nhlt) {
|
||||
dmic_num = intel_nhlt_get_dmic_geo(sdev->dev, nhlt);
|
||||
intel_nhlt_free(nhlt);
|
||||
if (dmic_num >= 1 && dmic_num <= 4)
|
||||
return dmic_num;
|
||||
}
|
||||
|
||||
return 0;
|
||||
/* allow for module parameter override */
|
||||
if (dmic_num_override != -1) {
|
||||
dev_dbg(sdev->dev,
|
||||
"overriding DMICs detected in NHLT tables %d by kernel param %d\n",
|
||||
dmic_num, dmic_num_override);
|
||||
dmic_num = dmic_num_override;
|
||||
}
|
||||
|
||||
if (dmic_num < 0 || dmic_num > 4) {
|
||||
dev_dbg(sdev->dev, "invalid dmic_number %d\n", dmic_num);
|
||||
dmic_num = 0;
|
||||
}
|
||||
|
||||
return dmic_num;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) || IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
|
||||
|
||||
static const char *fixup_tplg_name(struct snd_sof_dev *sdev,
|
||||
const char *sof_tplg_filename,
|
||||
const char *idisp_str,
|
||||
|
@ -697,16 +706,8 @@ static int dmic_topology_fixup(struct snd_sof_dev *sdev,
|
|||
const char *dmic_str;
|
||||
int dmic_num;
|
||||
|
||||
/* first check NHLT for DMICs */
|
||||
dmic_num = check_nhlt_dmic(sdev);
|
||||
|
||||
/* allow for module parameter override */
|
||||
if (hda_dmic_num != -1) {
|
||||
dev_dbg(sdev->dev,
|
||||
"overriding DMICs detected in NHLT tables %d by kernel param %d\n",
|
||||
dmic_num, hda_dmic_num);
|
||||
dmic_num = hda_dmic_num;
|
||||
}
|
||||
/* first check for DMICs (using NHLT or module parameter) */
|
||||
dmic_num = check_dmic_num(sdev);
|
||||
|
||||
switch (dmic_num) {
|
||||
case 1:
|
||||
|
@ -1383,6 +1384,9 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
if (!sof_pdata->tplg_filename)
|
||||
sof_pdata->tplg_filename = mach->sof_tplg_filename;
|
||||
|
||||
/* report to machine driver if any DMICs are found */
|
||||
mach->mach_params.dmic_num = check_dmic_num(sdev);
|
||||
|
||||
if (mach->link_mask) {
|
||||
mach->mach_params.links = mach->links;
|
||||
mach->mach_params.link_mask = mach->link_mask;
|
||||
|
|
Loading…
Reference in New Issue