]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: cs35l56: Use complete_all() to signal init_completion
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Thu, 16 Jul 2026 13:20:45 +0000 (14:20 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 16 Jul 2026 14:25:12 +0000 (15:25 +0100)
In cs35l56_init() use complete_all() to signal init_completion instead
of complete().

cs35l56_init() was signaling init_completion using the complete() function.
This only releases ONE waiter.

If cs35l56_component_probe() was called multiple times the first time
would consume that one signal, then future calls would timeout waiting for
the completion. This could happen if:

 - The component is probed, removed, then probed again without the cs35l56
   module being removed.

 - A call to component_probe() returns an error and ASoC calls it again
   later.

It should use complete_all() so that after it has been signaled it will
allow any code that waits on it to continue immediately.

The one case where the driver must wait for initialization to run again is
when waiting for a reboot after firmware download, and here the code
correctly calls reinit_completion() first.

Fixes: e496112529006 ("ASoC: cs35l56: Add driver for Cirrus Logic CS35L56")
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://patch.msgid.link/20260716132045.1469156-3-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs35l56.c

index fea4362e74cddb212292818ea376ef9cadb9a548..063ef7a70de03df7b5e6d6b92775b9cf5d21387d 100644 (file)
@@ -2123,7 +2123,7 @@ post_soft_reset:
                return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n");
 
        cs35l56->base.init_done = true;
-       complete(&cs35l56->init_completion);
+       complete_all(&cs35l56->init_completion);
 
        return 0;
 }