linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Corentin Labbe <clabbe@baylibre.com>
To: heiko@sntech.de, herbert@gondor.apana.org.au, ardb@kernel.org,
	davem@davemloft.net, krzysztof.kozlowski+dt@linaro.org,
	mturquette@baylibre.com, robh+dt@kernel.org, sboyd@kernel.org
Cc: linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org,
	Corentin Labbe <clabbe@baylibre.com>
Subject: [PATCH v9 30/33] crypto: rockchip: Check for clocks numbers and their frequencies
Date: Thu,  1 Sep 2022 12:57:07 +0000	[thread overview]
Message-ID: <20220901125710.3733083-31-clabbe@baylibre.com> (raw)
In-Reply-To: <20220901125710.3733083-1-clabbe@baylibre.com>

Add the number of clocks needed for each compatible.
Rockchip's datasheet give maximum frequencies for some clocks, so add
checks for verifying they are within limits. Let's start with rk3288 for
clock frequency check, other will came later.

Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
---
 drivers/crypto/rockchip/rk3288_crypto.c | 75 +++++++++++++++++++++----
 drivers/crypto/rockchip/rk3288_crypto.h | 16 +++++-
 2 files changed, 79 insertions(+), 12 deletions(-)

diff --git a/drivers/crypto/rockchip/rk3288_crypto.c b/drivers/crypto/rockchip/rk3288_crypto.c
index c92559b83f7d..232dc625d6e5 100644
--- a/drivers/crypto/rockchip/rk3288_crypto.c
+++ b/drivers/crypto/rockchip/rk3288_crypto.c
@@ -14,10 +14,58 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/clk.h>
 #include <linux/crypto.h>
 #include <linux/reset.h>
 
+static const struct rk_variant rk3288_variant = {
+	.num_clks = 4,
+	.rkclks = {
+		{ "sclk", 150000000},
+	}
+};
+
+static const struct rk_variant rk3328_variant = {
+	.num_clks = 3,
+};
+
+static int rk_crypto_get_clks(struct rk_crypto_info *dev)
+{
+	int i, j, err;
+	unsigned long cr;
+
+	dev->num_clks = devm_clk_bulk_get_all(dev->dev, &dev->clks);
+	if (dev->num_clks < dev->variant->num_clks) {
+		dev_err(dev->dev, "Missing clocks, got %d instead of %d\n",
+			dev->num_clks, dev->variant->num_clks);
+		return -EINVAL;
+	}
+
+	for (i = 0; i < dev->num_clks; i++) {
+		cr = clk_get_rate(dev->clks[i].clk);
+		for (j = 0; j < ARRAY_SIZE(dev->variant->rkclks); j++) {
+			if (dev->variant->rkclks[j].max == 0)
+				continue;
+			if (strcmp(dev->variant->rkclks[j].name, dev->clks[i].id))
+				continue;
+			if (cr > dev->variant->rkclks[j].max) {
+				err = clk_set_rate(dev->clks[i].clk,
+						   dev->variant->rkclks[j].max);
+				if (err)
+					dev_err(dev->dev, "Fail downclocking %s from %lu to %lu\n",
+						dev->variant->rkclks[j].name, cr,
+						dev->variant->rkclks[j].max);
+				else
+					dev_info(dev->dev, "Downclocking %s from %lu to %lu\n",
+						 dev->variant->rkclks[j].name, cr,
+						 dev->variant->rkclks[j].max);
+			}
+		}
+	}
+	return 0;
+}
+
 static int rk_crypto_enable_clk(struct rk_crypto_info *dev)
 {
 	int err;
@@ -201,8 +249,12 @@ static void rk_crypto_unregister(void)
 }
 
 static const struct of_device_id crypto_of_id_table[] = {
-	{ .compatible = "rockchip,rk3288-crypto" },
-	{ .compatible = "rockchip,rk3328-crypto" },
+	{ .compatible = "rockchip,rk3288-crypto",
+	  .data = &rk3288_variant,
+	},
+	{ .compatible = "rockchip,rk3328-crypto",
+	  .data = &rk3328_variant,
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, crypto_of_id_table);
@@ -220,6 +272,15 @@ static int rk_crypto_probe(struct platform_device *pdev)
 		goto err_crypto;
 	}
 
+	crypto_info->dev = &pdev->dev;
+	platform_set_drvdata(pdev, crypto_info);
+
+	crypto_info->variant = of_device_get_match_data(&pdev->dev);
+	if (!crypto_info->variant) {
+		dev_err(&pdev->dev, "Missing variant\n");
+		return -EINVAL;
+	}
+
 	crypto_info->rst = devm_reset_control_get(dev, "crypto-rst");
 	if (IS_ERR(crypto_info->rst)) {
 		err = PTR_ERR(crypto_info->rst);
@@ -236,12 +297,9 @@ static int rk_crypto_probe(struct platform_device *pdev)
 		goto err_crypto;
 	}
 
-	crypto_info->num_clks = devm_clk_bulk_get_all(&pdev->dev,
-						      &crypto_info->clks);
-	if (crypto_info->num_clks < 3) {
-		err = -EINVAL;
+	err = rk_crypto_get_clks(crypto_info);
+	if (err)
 		goto err_crypto;
-	}
 
 	crypto_info->irq = platform_get_irq(pdev, 0);
 	if (crypto_info->irq < 0) {
@@ -259,9 +317,6 @@ static int rk_crypto_probe(struct platform_device *pdev)
 		goto err_crypto;
 	}
 
-	crypto_info->dev = &pdev->dev;
-	platform_set_drvdata(pdev, crypto_info);
-
 	crypto_info->engine = crypto_engine_alloc_init(&pdev->dev, true);
 	crypto_engine_start(crypto_info->engine);
 	init_completion(&crypto_info->complete);
diff --git a/drivers/crypto/rockchip/rk3288_crypto.h b/drivers/crypto/rockchip/rk3288_crypto.h
index ff9fc25972eb..ac979d67ced9 100644
--- a/drivers/crypto/rockchip/rk3288_crypto.h
+++ b/drivers/crypto/rockchip/rk3288_crypto.h
@@ -188,14 +188,26 @@
 #define CRYPTO_WRITE(dev, offset, val)	  \
 		writel_relaxed((val), ((dev)->reg + (offset)))
 
+#define RK_MAX_CLKS 4
+
+struct rk_clks {
+	const char *name;
+	unsigned long max;
+};
+
+struct rk_variant {
+	int num_clks;
+	struct rk_clks rkclks[RK_MAX_CLKS];
+};
+
 struct rk_crypto_info {
 	struct device			*dev;
 	struct clk_bulk_data		*clks;
-	int num_clks;
+	int				num_clks;
 	struct reset_control		*rst;
 	void __iomem			*reg;
 	int				irq;
-
+	const struct rk_variant *variant;
 	struct crypto_engine *engine;
 	struct completion complete;
 	int status;
-- 
2.35.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2022-09-01 14:04 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-01 12:56 [PATCH v9 00/33] crypto: rockchip: permit to pass self-tests Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 01/33] crypto: rockchip: use dev_err for error message about interrupt Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 02/33] crypto: rockchip: do not use uninitialized variable Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 03/33] crypto: rockchip: do not do custom power management Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 04/33] crypto: rockchip: fix privete/private typo Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 05/33] crypto: rockchip: do not store mode globally Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 06/33] crypto: rockchip: add fallback for cipher Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 07/33] crypto: rockchip: add fallback for ahash Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 08/33] crypto: rockchip: better handle cipher key Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 09/33] crypto: rockchip: remove non-aligned handling Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 10/33] crypto: rockchip: rework by using crypto_engine Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 11/33] crypto: rockchip: rewrite type Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 12/33] crypto: rockchip: add debugfs Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 13/33] crypto: rockchip: introduce PM Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 14/33] crypto: rockchip: handle reset also in PM Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 15/33] crypto: rockchip: use clk_bulk to simplify clock management Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 16/33] crypto: rockchip: add myself as maintainer Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 17/33] crypto: rockchip: use read_poll_timeout Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 18/33] crypto: rockchip: fix style issue Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 19/33] crypto: rockchip: add support for rk3328 Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 20/33] crypto: rockchip: rename ablk functions to cipher Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 21/33] crypto: rockchip: rework rk_handle_req function Corentin Labbe
2022-09-01 12:56 ` [PATCH v9 22/33] crypto: rockchip: use a rk_crypto_info variable instead of lot of indirection Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 23/33] crypto: rockchip: use the rk_crypto_info given as parameter Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 24/33] dt-bindings: crypto: convert rockchip-crypto to YAML Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 25/33] dt-bindings: crypto: rockchip: convert to new driver bindings Corentin Labbe
2022-09-07 20:38   ` Rob Herring
2022-09-09  8:57     ` LABBE Corentin
2022-09-01 12:57 ` [PATCH v9 26/33] clk: rk3399: use proper crypto0 name Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 27/33] arm64: dts: rockchip: add rk3328 crypto node Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 28/33] arm64: dts: rockchip: rk3399: add " Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 29/33] crypto: rockchip: store crypto_info in request context Corentin Labbe
2022-09-01 12:57 ` Corentin Labbe [this message]
2022-09-01 12:57 ` [PATCH v9 31/33] crypto: rockchip: rk_ahash_reg_init use crypto_info from parameter Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 32/33] crypto: rockchip: permit to have more than one reset Corentin Labbe
2022-09-01 12:57 ` [PATCH v9 33/33] crypto: rockchip: Add support for RK3399 Corentin Labbe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220901125710.3733083-31-clabbe@baylibre.com \
    --to=clabbe@baylibre.com \
    --cc=ardb@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=heiko@sntech.de \
    --cc=herbert@gondor.apana.org.au \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=mturquette@baylibre.com \
    --cc=robh+dt@kernel.org \
    --cc=sboyd@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).