From 15ade055295d13f95d49e3d99b09f3bbfb4a43e7 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:25:24 +0000
Subject: [PATCH] add at24 driver
---
kernel/drivers/crypto/rockchip/rk_crypto_core.c | 38 +++++++++++++++++++++++++++++++-------
1 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_core.c b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
index f25d722..56a50d5 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
@@ -281,9 +281,11 @@
static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
{
struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
- struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
+ struct rk_alg_ctx *alg_ctx;
spin_lock(&rk_dev->lock);
+
+ alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
rk_dev->stat.irq_cnt++;
@@ -390,23 +392,22 @@
struct crypto_async_request *async_req, *backlog;
unsigned long flags;
+ spin_lock_irqsave(&rk_dev->lock, flags);
if (rk_dev->async_req) {
dev_err(rk_dev->dev, "%s: Unexpected crypto paths.\n", __func__);
- return;
+ goto exit;
}
rk_dev->err = 0;
- spin_lock_irqsave(&rk_dev->lock, flags);
+
backlog = crypto_get_backlog(&rk_dev->queue);
async_req = crypto_dequeue_request(&rk_dev->queue);
if (!async_req) {
rk_dev->busy = false;
- spin_unlock_irqrestore(&rk_dev->lock, flags);
- return;
+ goto exit;
}
rk_dev->stat.dequeue_cnt++;
- spin_unlock_irqrestore(&rk_dev->lock, flags);
if (backlog) {
backlog->complete(backlog, -EINPROGRESS);
@@ -417,12 +418,26 @@
rk_dev->err = rk_start_op(rk_dev);
if (rk_dev->err)
rk_complete_op(rk_dev, rk_dev->err);
+
+exit:
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
}
static void rk_crypto_done_task_cb(unsigned long data)
{
struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
- struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
+ struct rk_alg_ctx *alg_ctx;
+ unsigned long flags;
+
+ spin_lock_irqsave(&rk_dev->lock, flags);
+
+ if (!rk_dev->async_req) {
+ dev_err(rk_dev->dev, "done task receive invalid async_req\n");
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
+ return;
+ }
+
+ alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
rk_dev->stat.done_cnt++;
@@ -440,9 +455,12 @@
if (rk_dev->err)
goto exit;
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
+
return;
exit:
rk_complete_op(rk_dev, rk_dev->err);
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
}
static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev,
@@ -663,6 +681,12 @@
static const struct of_device_id crypto_of_id_table[] = {
#if IS_ENABLED(CONFIG_CRYPTO_DEV_ROCKCHIP_V3)
+ /* crypto v4 in belows same with crypto-v3*/
+ {
+ .compatible = "rockchip,crypto-v4",
+ .data = (void *)&cryto_v3_soc_data,
+ },
+
/* crypto v3 in belows */
{
.compatible = "rockchip,crypto-v3",
--
Gitblit v1.6.2