ASoC: cs35l56: Remove quick-cancelling of dsp_work()
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Tue, 11 Apr 2023 15:25:23 +0000 (16:25 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 12 Apr 2023 16:34:35 +0000 (17:34 +0100)
Delete the 'removing' flag and don't kick init_completion to make a
quick cancel of dsp_work(). Just let it timeout on the wait for the
completion.

Simplify the code to standard cancelling or flushing of the work.
This avoids introducing corner cases from a layer of custom signalling.
It also avoids potential race conditions when system-suspend handling
is added.

Unless the hardware is broken, the dsp_work() will already have started
and passed the completion before the driver would want to cancel it.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/168122674746.26.16881587647873355224@mailman-core.alsa-project.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs35l56.c
sound/soc/codecs/cs35l56.h

index 74e8de2f81f5600fe21f78f32df57dc088ed76c7..eb85c27ab08757f3607ee6f3c4a17e9717814b59 100644 (file)
@@ -875,7 +875,7 @@ static void cs35l56_dsp_work(struct work_struct *work)
                goto complete;
        }
 
-       if (!cs35l56->init_done || cs35l56->removing)
+       if (!cs35l56->init_done)
                goto complete;
 
        cs35l56->dsp.part = devm_kasprintf(cs35l56->dev, GFP_KERNEL, "cs35l56%s-%02x",
@@ -925,9 +925,6 @@ static void cs35l56_dsp_work(struct work_struct *work)
                goto err;
        }
 
-       if (cs35l56->removing)
-               goto err;
-
        mutex_lock(&cs35l56->irq_lock);
 
        init_completion(&cs35l56->init_completion);
@@ -975,7 +972,6 @@ static int cs35l56_component_probe(struct snd_soc_component *component)
 
        BUILD_BUG_ON(ARRAY_SIZE(cs35l56_tx_input_texts) != ARRAY_SIZE(cs35l56_tx_input_values));
 
-       cs35l56->removing = false;
        cs35l56->component = component;
        wm_adsp2_component_probe(&cs35l56->dsp, component);
 
@@ -992,8 +988,6 @@ static void cs35l56_component_remove(struct snd_soc_component *component)
 {
        struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
 
-       cs35l56->removing = true;
-       complete(&cs35l56->init_completion);
        cancel_work_sync(&cs35l56->dsp_work);
 }
 
index 919ba0267ef9bd68d7aa67cacdb0484d8fd04ddb..50278dafc9ca80a9b9ac4f5d21fa51aa70c1e704 100644 (file)
@@ -49,7 +49,6 @@ struct cs35l56_private {
        bool soft_resetting;
        bool init_done;
        bool sdw_attached;
-       bool removing;
        bool fw_patched;
        bool can_hibernate;
        struct completion init_completion;