#define BYT_RT5651_SSP2_AIF2           BIT(19) /* default is using AIF1  */
 #define BYT_RT5651_SSP0_AIF1           BIT(20)
 #define BYT_RT5651_SSP0_AIF2           BIT(21)
+#define BYT_RT5651_HP_LR_SWAPPED       BIT(22)
 
 #define BYT_RT5651_DEFAULT_QUIRKS      (BYT_RT5651_MCLK_EN | \
                                         BYT_RT5651_JD1_1   | \
                .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
                                        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) */
                .callback = byt_rt5651_quirk_cb,
                        DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"),
                },
                .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
-                                       BYT_RT5651_IN1_MAP),
+                                       BYT_RT5651_IN1_MAP |
+                                       BYT_RT5651_HP_LR_SWAPPED),
        },
        {
                /* VIOS LTH17 */
 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_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)
 {
        struct byt_rt5651_private *priv;
        struct snd_soc_acpi_mach *mach;
        const char *i2c_name = NULL;
+       const char *hp_swapped;
        bool is_bytcr = false;
        int ret_val = 0;
        int dai_index = 0;
                }
        }
 
+       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),
-                "bytcr-rt5651-%s-mic",
-                mic_name[BYT_RT5651_MAP(byt_rt5651_quirk)]);
+                "bytcr-rt5651-%s-mic%s",
+                mic_name[BYT_RT5651_MAP(byt_rt5651_quirk)], hp_swapped);
        byt_rt5651_card.long_name = byt_rt5651_long_name;
 
        ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5651_card);