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>
Tue, 11 Feb 2020 12:35:31 +0000 (04:35 -0800)
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 3cbefb4..2680e15 100644 (file)
@@ -1613,6 +1613,11 @@ static const struct of_device_id spacc_of_id_table[] = {
 MODULE_DEVICE_TABLE(of, spacc_of_id_table);
 #endif /* CONFIG_OF */
 
+static void spacc_tasklet_kill(void *data)
+{
+       tasklet_kill(data);
+}
+
 static int spacc_probe(struct platform_device *pdev)
 {
        int i, err, ret;
@@ -1655,6 +1660,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");
@@ -1712,8 +1725,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);