diff mbox series

[03/20] ASoC: SOF: Intel: hda: retrieve DMIC number for I2S boards

Message ID 20220308192610.392950-4-pierre-louis.bossart@linux.intel.com
State Accepted
Commit 92c1b7c0f780f0084f7b114be316ae4e182676e5
Headers show
Series ALSA/ASoC/SOF/Intel: improve support for ES8336-based platforms | expand

Commit Message

Pierre-Louis Bossart March 8, 2022, 7:25 p.m. UTC
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>
---
 sound/soc/sof/intel/hda.c | 46 +++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 21 deletions(-)

Comments

Cezary Rojewski March 9, 2022, 4:49 p.m. UTC | #1
On 2022-03-08 8:25 PM, Pierre-Louis Bossart wrote:
> 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.

...

> @@ -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;


s/int/u32? (paired with question below)

>   
>   	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) {

How come dmic_num be negative?

> +		dev_dbg(sdev->dev, "invalid dmic_number %d\n", dmic_num);
> +		dmic_num = 0;
> +	}
> +
> +	return dmic_num;
>   }
Pierre-Louis Bossart March 9, 2022, 5:10 p.m. UTC | #2
On 3/9/22 10:49, Cezary Rojewski wrote:
> On 2022-03-08 8:25 PM, Pierre-Louis Bossart wrote:
>> 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.
> 
> ...
> 
>> @@ -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;
> 
> 
> s/int/u32? (paired with question below)
> 
>>       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) {
> 
> How come dmic_num be negative?

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");

The value is already negative by default, and we want to apply sanity 
checks on what the user or distributions sets.

This code has been in the kernel for several years now, we're just 
moving it around.

> 
>> +        dev_dbg(sdev->dev, "invalid dmic_number %d\n", dmic_num);
>> +        dmic_num = 0;
>> +    }
>> +
>> +    return dmic_num;
>>   }
diff mbox series

Patch

diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index a99e6608f0b6..711d14a821bb 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -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;