| From fdf08725c99cc96189e3dc5e355dea60b861f4bb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 2 Sep 2025 19:18:21 +0200 |
| Subject: ASoC: Intel: bytcr_rt5651: Fix invalid quirk input mapping |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| [ 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 | 26 +++++++++++++++++++++----- |
| 1 file changed, 21 insertions(+), 5 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c |
| index 8e4b821efe927..6860ac41e6b32 100644 |
| --- a/sound/soc/intel/boards/bytcr_rt5651.c |
| +++ b/sound/soc/intel/boards/bytcr_rt5651.c |
| @@ -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)); |
| -- |
| 2.51.0 |
| |