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

ASoC: Intel: bytcr_rt5651: Add BYT_RT5651_HP_LR_SWAPPED quirk

One some models (Chuwi Vi8 Plus, Chuwi Hi8 Pro) the headphone output has
left and right swapped. This can be fixed in with special mixer settings
in the UCM profile, bit this requires these devices loading a different
UCM profile.

This commit adds a BYT_RT5651_HP_LR_SWAPPED quirk for this and postfixes
the longname with "-hp-swapped" if set, so that a different UCM profile
will be loaded.

We can safely do this without causing regressions (UCM profile not found
due to the longname change) as the UCM profiles are not in upstream
alsa-lib yet.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 8e69cd64
...@@ -73,6 +73,7 @@ enum { ...@@ -73,6 +73,7 @@ enum {
#define BYT_RT5651_SSP2_AIF2 BIT(19) /* default is using AIF1 */ #define BYT_RT5651_SSP2_AIF2 BIT(19) /* default is using AIF1 */
#define BYT_RT5651_SSP0_AIF1 BIT(20) #define BYT_RT5651_SSP0_AIF1 BIT(20)
#define BYT_RT5651_SSP0_AIF2 BIT(21) #define BYT_RT5651_SSP0_AIF2 BIT(21)
#define BYT_RT5651_HP_LR_SWAPPED BIT(22)
#define BYT_RT5651_DEFAULT_QUIRKS (BYT_RT5651_MCLK_EN | \ #define BYT_RT5651_DEFAULT_QUIRKS (BYT_RT5651_MCLK_EN | \
BYT_RT5651_JD1_1 | \ BYT_RT5651_JD1_1 | \
...@@ -359,6 +360,17 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = { ...@@ -359,6 +360,17 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
.driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS | .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
BYT_RT5651_IN1_IN2_MAP), BYT_RT5651_IN1_IN2_MAP),
}, },
{
/* Chuwi Hi8 Pro (CWI513) */
.callback = byt_rt5651_quirk_cb,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"),
DMI_MATCH(DMI_PRODUCT_NAME, "X1D3_C806N"),
},
.driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
BYT_RT5651_IN1_MAP |
BYT_RT5651_HP_LR_SWAPPED),
},
{ {
/* Chuwi Vi8 Plus (CWI519) */ /* Chuwi Vi8 Plus (CWI519) */
.callback = byt_rt5651_quirk_cb, .callback = byt_rt5651_quirk_cb,
...@@ -367,7 +379,8 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = { ...@@ -367,7 +379,8 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"), DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"),
}, },
.driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS | .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
BYT_RT5651_IN1_MAP), BYT_RT5651_IN1_MAP |
BYT_RT5651_HP_LR_SWAPPED),
}, },
{ {
/* VIOS LTH17 */ /* VIOS LTH17 */
...@@ -662,7 +675,7 @@ static struct snd_soc_card byt_rt5651_card = { ...@@ -662,7 +675,7 @@ static struct snd_soc_card byt_rt5651_card = {
static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN]; static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN];
static char byt_rt5651_codec_aif_name[12]; /* = "rt5651-aif[1|2]" */ static char byt_rt5651_codec_aif_name[12]; /* = "rt5651-aif[1|2]" */
static char byt_rt5651_cpu_dai_name[10]; /* = "ssp[0|2]-port" */ static char byt_rt5651_cpu_dai_name[10]; /* = "ssp[0|2]-port" */
static char byt_rt5651_long_name[40]; /* = "bytcr-rt5651-*-mic" */ static char byt_rt5651_long_name[40]; /* = "bytcr-rt5651-*-mic[-swapped-hp]" */
static bool is_valleyview(void) static bool is_valleyview(void)
{ {
...@@ -687,6 +700,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev) ...@@ -687,6 +700,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
struct byt_rt5651_private *priv; struct byt_rt5651_private *priv;
struct snd_soc_acpi_mach *mach; struct snd_soc_acpi_mach *mach;
const char *i2c_name = NULL; const char *i2c_name = NULL;
const char *hp_swapped;
bool is_bytcr = false; bool is_bytcr = false;
int ret_val = 0; int ret_val = 0;
int dai_index = 0; int dai_index = 0;
...@@ -829,9 +843,14 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev) ...@@ -829,9 +843,14 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
} }
} }
if (byt_rt5651_quirk & BYT_RT5651_HP_LR_SWAPPED)
hp_swapped = "-hp-swapped";
else
hp_swapped = "";
snprintf(byt_rt5651_long_name, sizeof(byt_rt5651_long_name), snprintf(byt_rt5651_long_name, sizeof(byt_rt5651_long_name),
"bytcr-rt5651-%s-mic", "bytcr-rt5651-%s-mic%s",
mic_name[BYT_RT5651_MAP(byt_rt5651_quirk)]); mic_name[BYT_RT5651_MAP(byt_rt5651_quirk)], hp_swapped);
byt_rt5651_card.long_name = byt_rt5651_long_name; byt_rt5651_card.long_name = byt_rt5651_long_name;
ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5651_card); ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5651_card);
......
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