]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: cs35l56: Move DSP part string generation so that it is done only once
authorSimon Trimmer <simont@opensource.cirrus.com>
Thu, 18 May 2023 15:02:48 +0000 (16:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 23 Aug 2023 15:32:25 +0000 (17:32 +0200)
[ Upstream commit 608f1b0dbddec6b2fd766c10bcce2b651995e936 ]

Each time we go through dsp_work() it does a devm_kasprintf() to
allocate memory to hold the part name string. It's not strictly a memory
leak because devm will free it all if the driver is removed. But we keep
allocating more and more memory to hold the same string.

Move the allocation so that it is performed after the version and
secured state information is gathered and handle allocation errors.

Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com>
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/Message-Id:
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/codecs/cs35l56.c

index e0d2b9bb232621babd7caa90f38720cbf42a7b65..f3fee448d759e5b7a1506c853c539c1795c70a19 100644 (file)
@@ -834,12 +834,6 @@ static void cs35l56_dsp_work(struct work_struct *work)
        if (!cs35l56->init_done)
                return;
 
-       cs35l56->dsp.part = devm_kasprintf(cs35l56->dev, GFP_KERNEL, "cs35l56%s-%02x",
-                                          cs35l56->secured ? "s" : "", cs35l56->rev);
-
-       if (!cs35l56->dsp.part)
-               return;
-
        pm_runtime_get_sync(cs35l56->dev);
 
        /*
@@ -1505,6 +1499,12 @@ int cs35l56_init(struct cs35l56_private *cs35l56)
        dev_info(cs35l56->dev, "Cirrus Logic CS35L56%s Rev %02X OTP%d\n",
                 cs35l56->secured ? "s" : "", cs35l56->rev, otpid);
 
+       /* Populate the DSP information with the revision and security state */
+       cs35l56->dsp.part = devm_kasprintf(cs35l56->dev, GFP_KERNEL, "cs35l56%s-%02x",
+                                          cs35l56->secured ? "s" : "", cs35l56->rev);
+       if (!cs35l56->dsp.part)
+               return -ENOMEM;
+
        /* Wake source and *_BLOCKED interrupts default to unmasked, so mask them */
        regmap_write(cs35l56->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff);
        regmap_update_bits(cs35l56->regmap, CS35L56_IRQ1_MASK_1,