ASoC: Intel: bytcr_rt5640: Set card long_name based on quirks
authorHans de Goede <hdegoede@redhat.com>
Sun, 13 May 2018 07:24:35 +0000 (09:24 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 17 May 2018 06:47:28 +0000 (15:47 +0900)
Many X86 devices using a BYT SoC + RT5640 codec are cheap devices with
generic DMI strings, causing snd_soc_set_dmi_name() to fail to set a
long_name, making it impossible for userspace to have a correct UCM
profile which only uses inputs / outputs which are actually hooked up
on the device.

Our quirks already specify which input the internal mic is connected to
and if a single (mono) speaker is used or if the device has stereo
speakers.

This commit sets a long_name based on the quirks so that userspace can
have UCM profiles doing the right thing based on the long_name.

Note that if we ever encounter the need for a special UCM profile for
some device we can add a quirk to set a specific long_name for the
device,

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/bytcr_rt5640.c

index 686d004..b0eec0a 100644 (file)
@@ -950,6 +950,7 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = {
 static char byt_rt5640_codec_name[SND_ACPI_I2C_ID_LEN];
 static char byt_rt5640_codec_aif_name[12]; /*  = "rt5640-aif[1|2]" */
 static char byt_rt5640_cpu_dai_name[10]; /*  = "ssp[0|2]-port" */
+static char byt_rt5640_long_name[40]; /* = "bytcr-rt5640-*-spk-*-mic" */
 
 static int byt_rt5640_suspend(struct snd_soc_card *card)
 {
@@ -1021,6 +1022,7 @@ struct acpi_chan_package {   /* ACPICA seems to require 64 bit integers */
 
 static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
 {
+       const char * const map_name[] = { "dmic1", "dmic2", "in1", "in3" };
        const struct dmi_system_id *dmi_id;
        struct byt_rt5640_private *priv;
        struct snd_soc_acpi_mach *mach;
@@ -1184,6 +1186,13 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
                }
        }
 
+       snprintf(byt_rt5640_long_name, sizeof(byt_rt5640_long_name),
+                "bytcr-rt5640-%s-spk-%s-mic",
+                (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) ?
+                       "mono" : "stereo",
+                map_name[BYT_RT5640_MAP(byt_rt5640_quirk)]);
+       byt_rt5640_card.long_name = byt_rt5640_long_name;
+
        ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5640_card);
 
        if (ret_val) {