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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2020 21:31:02 +0000 (16:31 -0500)
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/crypto/picoxcell_crypto.c

index 4757609..b3ea6d6 100644 (file)
@@ -1632,6 +1632,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;
@@ -1674,6 +1679,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");
@@ -1736,8 +1749,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);