mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
ASoC: Intel: Fix invalid quirk input mapping
Merge series from Takashi Iwai <tiwai@suse.de>: This is a revised patch set for potential OOB accesses when wild values are passed to quirk option for ASoC Intel drivers. Unlike the v1 previous patchset, invalid quirk values are checked and corrected at log_quirks() in each driver, instead. v1: https://lore.kernel.org/20250415083144.6588-1-tiwai@suse.de Takashi === Takashi Iwai (3): ASoC: Intel: bytcht_es8316: Fix invalid quirk input mapping ASoC: Intel: bytcr_rt5640: Fix invalid quirk input mapping ASoC: Intel: bytcr_rt5651: Fix invalid quirk input mapping sound/soc/intel/boards/bytcht_es8316.c | 20 +++++++++++++++++--- sound/soc/intel/boards/bytcr_rt5640.c | 7 +++++-- sound/soc/intel/boards/bytcr_rt5651.c | 26 +++++++++++++++++++++----- 3 files changed, 43 insertions(+), 10 deletions(-) -- 2.50.1
This commit is contained in:
commit
843e94cc1c
|
|
@ -47,7 +47,8 @@ enum {
|
|||
BYT_CHT_ES8316_INTMIC_IN2_MAP,
|
||||
};
|
||||
|
||||
#define BYT_CHT_ES8316_MAP(quirk) ((quirk) & GENMASK(3, 0))
|
||||
#define BYT_CHT_ES8316_MAP_MASK GENMASK(3, 0)
|
||||
#define BYT_CHT_ES8316_MAP(quirk) ((quirk) & BYT_CHT_ES8316_MAP_MASK)
|
||||
#define BYT_CHT_ES8316_SSP0 BIT(16)
|
||||
#define BYT_CHT_ES8316_MONO_SPEAKER BIT(17)
|
||||
#define BYT_CHT_ES8316_JD_INVERTED BIT(18)
|
||||
|
|
@ -60,10 +61,23 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
|
|||
|
||||
static void log_quirks(struct device *dev)
|
||||
{
|
||||
if (BYT_CHT_ES8316_MAP(quirk) == BYT_CHT_ES8316_INTMIC_IN1_MAP)
|
||||
int map;
|
||||
|
||||
map = BYT_CHT_ES8316_MAP(quirk);
|
||||
switch (map) {
|
||||
case BYT_CHT_ES8316_INTMIC_IN1_MAP:
|
||||
dev_info(dev, "quirk IN1_MAP enabled");
|
||||
if (BYT_CHT_ES8316_MAP(quirk) == BYT_CHT_ES8316_INTMIC_IN2_MAP)
|
||||
break;
|
||||
case BYT_CHT_ES8316_INTMIC_IN2_MAP:
|
||||
dev_info(dev, "quirk IN2_MAP enabled");
|
||||
break;
|
||||
default:
|
||||
dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to INTMIC_IN1_MAP\n", map);
|
||||
quirk &= ~BYT_CHT_ES8316_MAP_MASK;
|
||||
quirk |= BYT_CHT_ES8316_INTMIC_IN1_MAP;
|
||||
break;
|
||||
}
|
||||
|
||||
if (quirk & BYT_CHT_ES8316_SSP0)
|
||||
dev_info(dev, "quirk SSP0 enabled");
|
||||
if (quirk & BYT_CHT_ES8316_MONO_SPEAKER)
|
||||
|
|
|
|||
|
|
@ -68,7 +68,8 @@ enum {
|
|||
BYT_RT5640_OVCD_SF_1P5 = (RT5640_OVCD_SF_1P5 << 13),
|
||||
};
|
||||
|
||||
#define BYT_RT5640_MAP(quirk) ((quirk) & GENMASK(3, 0))
|
||||
#define BYT_RT5640_MAP_MASK GENMASK(3, 0)
|
||||
#define BYT_RT5640_MAP(quirk) ((quirk) & BYT_RT5640_MAP_MASK)
|
||||
#define BYT_RT5640_JDSRC(quirk) (((quirk) & GENMASK(7, 4)) >> 4)
|
||||
#define BYT_RT5640_OVCD_TH(quirk) (((quirk) & GENMASK(12, 8)) >> 8)
|
||||
#define BYT_RT5640_OVCD_SF(quirk) (((quirk) & GENMASK(14, 13)) >> 13)
|
||||
|
|
@ -140,7 +141,9 @@ static void log_quirks(struct device *dev)
|
|||
dev_info(dev, "quirk NO_INTERNAL_MIC_MAP enabled\n");
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "quirk map 0x%x is not supported, microphone input will not work\n", map);
|
||||
dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to DMIC1_MAP\n", map);
|
||||
byt_rt5640_quirk &= ~BYT_RT5640_MAP_MASK;
|
||||
byt_rt5640_quirk |= BYT_RT5640_DMIC1_MAP;
|
||||
break;
|
||||
}
|
||||
if (byt_rt5640_quirk & BYT_RT5640_HSMIC2_ON_IN1)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user