]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: omap - convert from tasklet to BH workqueue
authorRyo Takakura <ryotkkr98@gmail.com>
Sat, 6 Sep 2025 11:41:35 +0000 (11:41 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 13 Sep 2025 04:11:06 +0000 (12:11 +0800)
tasklet has been marked deprecated and it's planned to be
removed. Make omap crypto drivers to use BH workqueue which
is the new interface for executing in BH context in place
of tasklet.

Signed-off-by: Ryo Takakura <ryotkkr98@gmail.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-aes.c
drivers/crypto/omap-aes.h
drivers/crypto/omap-des.c
drivers/crypto/omap-sham.c

index 244e24e52987e41ee114a66b1f4e7a9fe394f999..3cc802622dd5c06f616c14f1fabbbd4d7f67f07d 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/scatterlist.h>
 #include <linux/string.h>
+#include <linux/workqueue.h>
 
 #include "omap-crypto.h"
 #include "omap-aes.h"
@@ -221,7 +222,7 @@ static void omap_aes_dma_out_callback(void *data)
        struct omap_aes_dev *dd = data;
 
        /* dma_lch_out - completed */
-       tasklet_schedule(&dd->done_task);
+       queue_work(system_bh_wq, &dd->done_task);
 }
 
 static int omap_aes_dma_init(struct omap_aes_dev *dd)
@@ -494,9 +495,9 @@ static void omap_aes_copy_ivout(struct omap_aes_dev *dd, u8 *ivbuf)
                ((u32 *)ivbuf)[i] = omap_aes_read(dd, AES_REG_IV(dd, i));
 }
 
-static void omap_aes_done_task(unsigned long data)
+static void omap_aes_done_task(struct work_struct *t)
 {
-       struct omap_aes_dev *dd = (struct omap_aes_dev *)data;
+       struct omap_aes_dev *dd = from_work(dd, t, done_task);
 
        pr_debug("enter done_task\n");
 
@@ -925,7 +926,7 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)
 
                if (!dd->total)
                        /* All bytes read! */
-                       tasklet_schedule(&dd->done_task);
+                       queue_work(system_bh_wq, &dd->done_task);
                else
                        /* Enable DATA_IN interrupt for next block */
                        omap_aes_write(dd, AES_REG_IRQ_ENABLE(dd), 0x2);
@@ -1140,7 +1141,7 @@ static int omap_aes_probe(struct platform_device *pdev)
                 (reg & dd->pdata->major_mask) >> dd->pdata->major_shift,
                 (reg & dd->pdata->minor_mask) >> dd->pdata->minor_shift);
 
-       tasklet_init(&dd->done_task, omap_aes_done_task, (unsigned long)dd);
+       INIT_WORK(&dd->done_task, omap_aes_done_task);
 
        err = omap_aes_dma_init(dd);
        if (err == -EPROBE_DEFER) {
@@ -1229,7 +1230,7 @@ err_engine:
 
        omap_aes_dma_cleanup(dd);
 err_irq:
-       tasklet_kill(&dd->done_task);
+       cancel_work_sync(&dd->done_task);
 err_pm_disable:
        pm_runtime_disable(dev);
 err_res:
@@ -1264,7 +1265,7 @@ static void omap_aes_remove(struct platform_device *pdev)
 
        crypto_engine_exit(dd->engine);
 
-       tasklet_kill(&dd->done_task);
+       cancel_work_sync(&dd->done_task);
        omap_aes_dma_cleanup(dd);
        pm_runtime_disable(dd->dev);
 }
index 41d67780fd45d5b603373fd2aac019158792522c..99c36a777e9719d8fd6a0bb2041bee8bc3f64442 100644 (file)
@@ -159,7 +159,7 @@ struct omap_aes_dev {
        unsigned long           flags;
        int                     err;
 
-       struct tasklet_struct   done_task;
+       struct work_struct      done_task;
        struct aead_queue       aead_queue;
        spinlock_t              lock;
 
index 9c5538ae17db2b6655a1114cb450567de658e950..149ebd77710bf5ae84d394e09847e083ca9a892e 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/scatterlist.h>
 #include <linux/string.h>
+#include <linux/workqueue.h>
 
 #include "omap-crypto.h"
 
@@ -130,7 +131,7 @@ struct omap_des_dev {
        unsigned long           flags;
        int                     err;
 
-       struct tasklet_struct   done_task;
+       struct work_struct      done_task;
 
        struct skcipher_request *req;
        struct crypto_engine            *engine;
@@ -325,7 +326,7 @@ static void omap_des_dma_out_callback(void *data)
        struct omap_des_dev *dd = data;
 
        /* dma_lch_out - completed */
-       tasklet_schedule(&dd->done_task);
+       queue_work(system_bh_wq, &dd->done_task);
 }
 
 static int omap_des_dma_init(struct omap_des_dev *dd)
@@ -580,9 +581,9 @@ static int omap_des_crypt_req(struct crypto_engine *engine,
               omap_des_crypt_dma_start(dd);
 }
 
-static void omap_des_done_task(unsigned long data)
+static void omap_des_done_task(struct work_struct *t)
 {
-       struct omap_des_dev *dd = (struct omap_des_dev *)data;
+       struct omap_des_dev *dd = from_work(dd, t, done_task);
        int i;
 
        pr_debug("enter done_task\n");
@@ -890,7 +891,7 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)
 
                if (!dd->total)
                        /* All bytes read! */
-                       tasklet_schedule(&dd->done_task);
+                       queue_work(system_bh_wq, &dd->done_task);
                else
                        /* Enable DATA_IN interrupt for next block */
                        omap_des_write(dd, DES_REG_IRQ_ENABLE(dd), 0x2);
@@ -986,7 +987,7 @@ static int omap_des_probe(struct platform_device *pdev)
                 (reg & dd->pdata->major_mask) >> dd->pdata->major_shift,
                 (reg & dd->pdata->minor_mask) >> dd->pdata->minor_shift);
 
-       tasklet_init(&dd->done_task, omap_des_done_task, (unsigned long)dd);
+       INIT_WORK(&dd->done_task, omap_des_done_task);
 
        err = omap_des_dma_init(dd);
        if (err == -EPROBE_DEFER) {
@@ -1053,7 +1054,7 @@ err_engine:
 
        omap_des_dma_cleanup(dd);
 err_irq:
-       tasklet_kill(&dd->done_task);
+       cancel_work_sync(&dd->done_task);
 err_get:
        pm_runtime_disable(dev);
 err_res:
@@ -1077,7 +1078,7 @@ static void omap_des_remove(struct platform_device *pdev)
                        crypto_engine_unregister_skcipher(
                                        &dd->pdata->algs_info[i].algs_list[j]);
 
-       tasklet_kill(&dd->done_task);
+       cancel_work_sync(&dd->done_task);
        omap_des_dma_cleanup(dd);
        pm_runtime_disable(dd->dev);
 }
index 6328e8026b91e7391906b62c66dc028a95597ed6..ff8aac02994a4891b0c09c1ea1458ae646e9eff6 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <linux/workqueue.h>
 
 #define MD5_DIGEST_SIZE                        16
 
@@ -217,7 +218,7 @@ struct omap_sham_dev {
        int                     irq;
        int                     err;
        struct dma_chan         *dma_lch;
-       struct tasklet_struct   done_task;
+       struct work_struct      done_task;
        u8                      polling_mode;
        u8                      xmit_buf[BUFLEN] OMAP_ALIGNED;
 
@@ -561,7 +562,7 @@ static void omap_sham_dma_callback(void *param)
        struct omap_sham_dev *dd = param;
 
        set_bit(FLAGS_DMA_READY, &dd->flags);
-       tasklet_schedule(&dd->done_task);
+       queue_work(system_bh_wq, &dd->done_task);
 }
 
 static int omap_sham_xmit_dma(struct omap_sham_dev *dd, size_t length,
@@ -1703,9 +1704,9 @@ static struct ahash_engine_alg algs_sha384_sha512[] = {
 },
 };
 
-static void omap_sham_done_task(unsigned long data)
+static void omap_sham_done_task(struct work_struct *t)
 {
-       struct omap_sham_dev *dd = (struct omap_sham_dev *)data;
+       struct omap_sham_dev *dd = from_work(dd, t, done_task);
        int err = 0;
 
        dev_dbg(dd->dev, "%s: flags=%lx\n", __func__, dd->flags);
@@ -1739,7 +1740,7 @@ finish:
 static irqreturn_t omap_sham_irq_common(struct omap_sham_dev *dd)
 {
        set_bit(FLAGS_OUTPUT_READY, &dd->flags);
-       tasklet_schedule(&dd->done_task);
+       queue_work(system_bh_wq, &dd->done_task);
 
        return IRQ_HANDLED;
 }
@@ -2059,7 +2060,7 @@ static int omap_sham_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, dd);
 
        INIT_LIST_HEAD(&dd->list);
-       tasklet_init(&dd->done_task, omap_sham_done_task, (unsigned long)dd);
+       INIT_WORK(&dd->done_task, omap_sham_done_task);
        crypto_init_queue(&dd->queue, OMAP_SHAM_QUEUE_LENGTH);
 
        err = (dev->of_node) ? omap_sham_get_res_of(dd, dev, &res) :
@@ -2194,7 +2195,7 @@ static void omap_sham_remove(struct platform_device *pdev)
                                        &dd->pdata->algs_info[i].algs_list[j]);
                        dd->pdata->algs_info[i].registered--;
                }
-       tasklet_kill(&dd->done_task);
+       cancel_work_sync(&dd->done_task);
        pm_runtime_dont_use_autosuspend(&pdev->dev);
        pm_runtime_disable(&pdev->dev);