]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: Intel: bytcr_rt5651: Fix invalid quirk input mapping
authorTakashi Iwai <tiwai@suse.de>
Tue, 2 Sep 2025 17:18:21 +0000 (19:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Oct 2025 09:56:33 +0000 (11:56 +0200)
[ Upstream commit 4336efb59ef364e691ef829a73d9dbd4d5ed7c7b ]

When an invalid value is passed via quirk option, currently
bytcr_rt5640 driver just ignores and leaves as is, which may lead to
unepxected results like OOB access.

This patch adds the sanity check and corrects the input mapping to the
certain default value if an invalid value is passed.

Fixes: 64484ccee7af ("ASoC: Intel: bytcr_rt5651: Set card long_name based on quirks")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Message-ID: <20250902171826.27329-4-tiwai@suse.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/intel/boards/bytcr_rt5651.c

index d74d184e1c7f3d8a622940cc68dcefcc16686213..b9990cb1181ffd566a2d4458a765477b20b7b718 100644 (file)
@@ -58,7 +58,8 @@ enum {
        BYT_RT5651_OVCD_SF_1P5  = (RT5651_OVCD_SF_1P5 << 13),
 };
 
-#define BYT_RT5651_MAP(quirk)          ((quirk) & GENMASK(3, 0))
+#define BYT_RT5651_MAP_MASK            GENMASK(3, 0)
+#define BYT_RT5651_MAP(quirk)          ((quirk) & BYT_RT5651_MAP_MASK)
 #define BYT_RT5651_JDSRC(quirk)                (((quirk) & GENMASK(7, 4)) >> 4)
 #define BYT_RT5651_OVCD_TH(quirk)      (((quirk) & GENMASK(12, 8)) >> 8)
 #define BYT_RT5651_OVCD_SF(quirk)      (((quirk) & GENMASK(14, 13)) >> 13)
@@ -100,14 +101,29 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
 
 static void log_quirks(struct device *dev)
 {
-       if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_DMIC_MAP)
+       int map;
+
+       map = BYT_RT5651_MAP(byt_rt5651_quirk);
+       switch (map) {
+       case BYT_RT5651_DMIC_MAP:
                dev_info(dev, "quirk DMIC_MAP enabled");
-       if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_MAP)
+               break;
+       case BYT_RT5651_IN1_MAP:
                dev_info(dev, "quirk IN1_MAP enabled");
-       if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN2_MAP)
+               break;
+       case BYT_RT5651_IN2_MAP:
                dev_info(dev, "quirk IN2_MAP enabled");
-       if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_IN2_MAP)
+               break;
+       case BYT_RT5651_IN1_IN2_MAP:
                dev_info(dev, "quirk IN1_IN2_MAP enabled");
+               break;
+       default:
+               dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to DMIC_MAP\n", map);
+               byt_rt5651_quirk &= ~BYT_RT5651_MAP_MASK;
+               byt_rt5651_quirk |= BYT_RT5651_DMIC_MAP;
+               break;
+       }
+
        if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) {
                dev_info(dev, "quirk realtek,jack-detect-source %ld\n",
                         BYT_RT5651_JDSRC(byt_rt5651_quirk));