OSDN Git Service

ASoC: cs35l41: Fix use of an uninitialised variable
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Tue, 14 Sep 2021 14:13:44 +0000 (15:13 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 15 Sep 2021 12:12:30 +0000 (13:12 +0100)
The loop checking PDN_DONE doesn't check the return value from
regmap_read, nor does it initialise val. This means if regmap_read fails
val will be checked for the PDN_DONE bit whilst being uninitialised.

Fix this up by switching to regmap_read_poll_timeout which tidies up the
code and avoids the uninitialised variable.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20210914141349.30218-1-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs35l41.c

index dbec54a..d2a11cc 100644 (file)
@@ -580,7 +580,6 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
        unsigned int val;
        int ret = 0;
        bool pdn;
-       int i;
 
        switch (event) {
        case SND_SOC_DAPM_POST_PMU:
@@ -599,19 +598,11 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
                                CS35L41_GLOBAL_EN_MASK, 0);
 
                pdn = false;
-               for (i = 0; i < 100; i++) {
-                       regmap_read(cs35l41->regmap,
-                               CS35L41_IRQ1_STATUS1,
-                               &val);
-                       if (val & CS35L41_PDN_DONE_MASK) {
-                               pdn = true;
-                               break;
-                       }
-                       usleep_range(1000, 1100);
-               }
-
-               if (!pdn)
-                       dev_warn(cs35l41->dev, "PDN failed\n");
+               ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS1,
+                                              val, val &  CS35L41_PDN_DONE_MASK,
+                                              1000, 100000);
+               if (ret)
+                       dev_warn(cs35l41->dev, "PDN failed: %d\n", ret);
 
                regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1,
                                CS35L41_PDN_DONE_MASK);