]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: picoxcell - adjust the position of tasklet_init and fix missed tasklet_kill
authorChuhong Yuan <hslester96@gmail.com>
Mon, 9 Dec 2019 16:21:44 +0000 (00:21 +0800)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 22 May 2020 20:19:21 +0000 (21:19 +0100)
commit 7f8c36fe9be46862c4f3c5302f769378028a34fa upstream.

Since tasklet is needed to be initialized before registering IRQ
handler, adjust the position of tasklet_init to fix the wrong order.

Besides, to fix the missed tasklet_kill, this patch adds a helper
function and uses devm_add_action to kill the tasklet automatically.

Fixes: ce92136843cb ("crypto: picoxcell - add support for the picoxcell crypto engines")
Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/crypto/picoxcell_crypto.c

index 5da5b98b8f297a36a98dca4d90b7ede3cdce6a07..8bdd1e6419146a4cb9875dbe932ca8eb879b174c 100644 (file)
@@ -1690,6 +1690,11 @@ static bool spacc_is_compatible(struct platform_device *pdev,
        return false;
 }
 
+static void spacc_tasklet_kill(void *data)
+{
+       tasklet_kill(data);
+}
+
 static int spacc_probe(struct platform_device *pdev)
 {
        int i, err, ret = -EINVAL;
@@ -1730,6 +1735,14 @@ static int spacc_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
+       tasklet_init(&engine->complete, spacc_spacc_complete,
+                    (unsigned long)engine);
+
+       ret = devm_add_action(&pdev->dev, spacc_tasklet_kill,
+                             &engine->complete);
+       if (ret)
+               return ret;
+
        if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0,
                             engine->name, engine)) {
                dev_err(engine->dev, "failed to request IRQ\n");
@@ -1792,8 +1805,6 @@ static int spacc_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&engine->completed);
        INIT_LIST_HEAD(&engine->in_progress);
        engine->in_flight = 0;
-       tasklet_init(&engine->complete, spacc_spacc_complete,
-                    (unsigned long)engine);
 
        platform_set_drvdata(pdev, engine);