summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorDmytro Maluka <dmy@semihalf.com>2023-07-17 21:37:37 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-09-13 09:42:21 +0200
commiteb746c4750a893c2bf75d7548a8f6f40beeca74a (patch)
treee1b270ca887e0ab171c77ad0bb8b034e05a11495 /sound
parent3c59ad8d6e8e89ced34da6e53abb0400a737f2ef (diff)
downloadlinux-stable-eb746c4750a893c2bf75d7548a8f6f40beeca74a.tar.gz
linux-stable-eb746c4750a893c2bf75d7548a8f6f40beeca74a.tar.bz2
linux-stable-eb746c4750a893c2bf75d7548a8f6f40beeca74a.zip
ASoC: da7219: Check for failure reading AAD IRQ events
[ Upstream commit f0691dc16206f21b13c464434366e2cd632b8ed7 ] When handling an AAD interrupt, if IRQ events read failed (for example, due to i2c "Transfer while suspended" failure, i.e. when attempting to read it while DA7219 is suspended, which may happen due to a spurious AAD interrupt), the events array contains garbage uninitialized values. So instead of trying to interprete those values and doing any actions based on them (potentially resulting in misbehavior, e.g. reporting bogus events), refuse to handle the interrupt. Signed-off-by: Dmytro Maluka <dmy@semihalf.com> Link: https://lore.kernel.org/r/20230717193737.161784-3-dmy@semihalf.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/da7219-aad.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sound/soc/codecs/da7219-aad.c b/sound/soc/codecs/da7219-aad.c
index 49b1622e7bad..9251490548e8 100644
--- a/sound/soc/codecs/da7219-aad.c
+++ b/sound/soc/codecs/da7219-aad.c
@@ -353,11 +353,15 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data)
struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component);
u8 events[DA7219_AAD_IRQ_REG_MAX];
u8 statusa;
- int i, report = 0, mask = 0;
+ int i, ret, report = 0, mask = 0;
/* Read current IRQ events */
- regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
- events, DA7219_AAD_IRQ_REG_MAX);
+ ret = regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
+ events, DA7219_AAD_IRQ_REG_MAX);
+ if (ret) {
+ dev_warn_ratelimited(component->dev, "Failed to read IRQ events: %d\n", ret);
+ return IRQ_NONE;
+ }
if (!events[DA7219_AAD_IRQ_REG_A] && !events[DA7219_AAD_IRQ_REG_B])
return IRQ_NONE;