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