Commit 381e8ee3 authored by Ryo Takakura's avatar Ryo Takakura Committed by Herbert Xu
Browse files

crypto: omap - convert from tasklet to BH workqueue



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: default avatarRyo Takakura <ryotkkr98@gmail.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 1e263397
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -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 @@ static int omap_aes_probe(struct platform_device *pdev)

	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);
}
+1 −1
Original line number Diff line number Diff line
@@ -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;

+9 −8
Original line number Diff line number Diff line
@@ -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 @@ static int omap_des_probe(struct platform_device *pdev)

	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);
}
+8 −7
Original line number Diff line number Diff line
@@ -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 @@ static void omap_sham_done_task(unsigned long data)
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);