ASoC: Intel: bytcr_rt5640: quirk for mono speaker
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 12 Aug 2016 21:27:45 +0000 (16:27 -0500)
committerMark Brown <broonie@kernel.org>
Mon, 15 Aug 2016 14:14:57 +0000 (15:14 +0100)
Some Baytrail devices only have a mono speaker, add quirk and enable
it for T100TAF.

Signed-off-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 2d3441d58d6f32f6136684a74ce18aedeb0bd599..421a53cfa53f390edfe86c7ab38322e10287dc43 100644 (file)
@@ -40,6 +40,7 @@ enum {
 
 #define BYT_RT5640_MAP(quirk)  ((quirk) & 0xff)
 #define BYT_RT5640_DMIC_EN     BIT(16)
+#define BYT_RT5640_MONO_SPEAKER BIT(17)
 
 static unsigned long byt_rt5640_quirk = BYT_RT5640_DMIC1_MAP |
                                        BYT_RT5640_DMIC_EN;
@@ -63,10 +64,6 @@ static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
        {"IN2P", NULL, "Headset Mic"},
        {"Headphone", NULL, "HPOL"},
        {"Headphone", NULL, "HPOR"},
-       {"Speaker", NULL, "SPOLP"},
-       {"Speaker", NULL, "SPOLN"},
-       {"Speaker", NULL, "SPORP"},
-       {"Speaker", NULL, "SPORN"},
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = {
@@ -82,6 +79,18 @@ static const struct snd_soc_dapm_route byt_rt5640_intmic_in1_map[] = {
        {"IN1P", NULL, "Internal Mic"},
 };
 
+static const struct snd_soc_dapm_route byt_rt5640_stereo_spk_map[] = {
+       {"Speaker", NULL, "SPOLP"},
+       {"Speaker", NULL, "SPOLN"},
+       {"Speaker", NULL, "SPORP"},
+       {"Speaker", NULL, "SPORN"},
+};
+
+static const struct snd_soc_dapm_route byt_rt5640_mono_spk_map[] = {
+       {"Speaker", NULL, "SPOLP"},
+       {"Speaker", NULL, "SPOLN"},
+};
+
 static const struct snd_kcontrol_new byt_rt5640_controls[] = {
        SOC_DAPM_PIN_SWITCH("Headphone"),
        SOC_DAPM_PIN_SWITCH("Headset Mic"),
@@ -138,7 +147,9 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
                        DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
                        DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100TAF"),
                },
-               .driver_data = (unsigned long *)BYT_RT5640_IN1_MAP,
+               .driver_data = (unsigned long *)(BYT_RT5640_IN1_MAP |
+                                                BYT_RT5640_MONO_SPEAKER
+                                                ),
        },
        {
                .callback = byt_rt5640_quirk_cb,
@@ -200,6 +211,18 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime)
        if (ret)
                return ret;
 
+       if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) {
+               ret = snd_soc_dapm_add_routes(&card->dapm,
+                                       byt_rt5640_mono_spk_map,
+                                       ARRAY_SIZE(byt_rt5640_mono_spk_map));
+       } else {
+               ret = snd_soc_dapm_add_routes(&card->dapm,
+                                       byt_rt5640_stereo_spk_map,
+                                       ARRAY_SIZE(byt_rt5640_stereo_spk_map));
+       }
+       if (ret)
+               return ret;
+
        if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) {
                ret = rt5640_dmic_enable(codec, 0, 0);
                if (ret)