Commit b1b6131b authored by Hans de Goede's avatar Hans de Goede Committed by Mark Brown

ASoC: Intel: bytcr_rt5640: Add new swapped-speakers quirk

Some BYTCR x86 tablets with a rt5640 codec have the left and right channels
of their speakers swapped.

Add a new BYT_RT5640_SWAPPED_SPEAKERS quirk for this which sets
cfg-spk:swapped in the components string to let userspace know
about the swapping so that the UCM profile can configure the mixer
to correct this.

Enable this new quirk on the Medion Lifetab S10346 which has its
speakers swapped.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://msgid.link/r/20231217213221.49424-2-hdegoede@redhat.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 99c7bb44
...@@ -83,6 +83,7 @@ enum { ...@@ -83,6 +83,7 @@ enum {
#define BYT_RT5640_HSMIC2_ON_IN1 BIT(27) #define BYT_RT5640_HSMIC2_ON_IN1 BIT(27)
#define BYT_RT5640_JD_HP_ELITEP_1000G2 BIT(28) #define BYT_RT5640_JD_HP_ELITEP_1000G2 BIT(28)
#define BYT_RT5640_USE_AMCR0F28 BIT(29) #define BYT_RT5640_USE_AMCR0F28 BIT(29)
#define BYT_RT5640_SWAPPED_SPEAKERS BIT(30)
#define BYTCR_INPUT_DEFAULTS \ #define BYTCR_INPUT_DEFAULTS \
(BYT_RT5640_IN3_MAP | \ (BYT_RT5640_IN3_MAP | \
...@@ -157,6 +158,8 @@ static void log_quirks(struct device *dev) ...@@ -157,6 +158,8 @@ static void log_quirks(struct device *dev)
dev_info(dev, "quirk MONO_SPEAKER enabled\n"); dev_info(dev, "quirk MONO_SPEAKER enabled\n");
if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS)
dev_info(dev, "quirk NO_SPEAKERS enabled\n"); dev_info(dev, "quirk NO_SPEAKERS enabled\n");
if (byt_rt5640_quirk & BYT_RT5640_SWAPPED_SPEAKERS)
dev_info(dev, "quirk SWAPPED_SPEAKERS enabled\n");
if (byt_rt5640_quirk & BYT_RT5640_LINEOUT) if (byt_rt5640_quirk & BYT_RT5640_LINEOUT)
dev_info(dev, "quirk LINEOUT enabled\n"); dev_info(dev, "quirk LINEOUT enabled\n");
if (byt_rt5640_quirk & BYT_RT5640_LINEOUT_AS_HP2) if (byt_rt5640_quirk & BYT_RT5640_LINEOUT_AS_HP2)
...@@ -903,6 +906,7 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { ...@@ -903,6 +906,7 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"), DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"),
}, },
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS | .driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
BYT_RT5640_SWAPPED_SPEAKERS |
BYT_RT5640_SSP0_AIF1 | BYT_RT5640_SSP0_AIF1 |
BYT_RT5640_MCLK_EN), BYT_RT5640_MCLK_EN),
}, },
...@@ -1631,11 +1635,11 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) ...@@ -1631,11 +1635,11 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
const char *platform_name; const char *platform_name;
struct acpi_device *adev; struct acpi_device *adev;
struct device *codec_dev; struct device *codec_dev;
const char *cfg_spk;
bool sof_parent; bool sof_parent;
int ret_val = 0; int ret_val = 0;
int dai_index = 0; int dai_index = 0;
int i, cfg_spk; int i, aif;
int aif;
is_bytcr = false; is_bytcr = false;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
...@@ -1795,13 +1799,16 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) ...@@ -1795,13 +1799,16 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
} }
if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) { if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) {
cfg_spk = 0; cfg_spk = "0";
spk_type = "none"; spk_type = "none";
} else if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) { } else if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) {
cfg_spk = 1; cfg_spk = "1";
spk_type = "mono"; spk_type = "mono";
} else if (byt_rt5640_quirk & BYT_RT5640_SWAPPED_SPEAKERS) {
cfg_spk = "swapped";
spk_type = "swapped";
} else { } else {
cfg_spk = 2; cfg_spk = "2";
spk_type = "stereo"; spk_type = "stereo";
} }
...@@ -1816,7 +1823,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) ...@@ -1816,7 +1823,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
headset2_string = " cfg-hs2:in1"; headset2_string = " cfg-hs2:in1";
snprintf(byt_rt5640_components, sizeof(byt_rt5640_components), snprintf(byt_rt5640_components, sizeof(byt_rt5640_components),
"cfg-spk:%d cfg-mic:%s aif:%d%s%s", cfg_spk, "cfg-spk:%s cfg-mic:%s aif:%d%s%s", cfg_spk,
map_name[BYT_RT5640_MAP(byt_rt5640_quirk)], aif, map_name[BYT_RT5640_MAP(byt_rt5640_quirk)], aif,
lineout_string, headset2_string); lineout_string, headset2_string);
byt_rt5640_card.components = byt_rt5640_components; byt_rt5640_card.components = byt_rt5640_components;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment