Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2278667pxp; Mon, 21 Mar 2022 15:42:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwFTnOjTqhqexGE6Reqa34SJGA/tv5q1HV9xB9/juc9B8yilzkoZH6rPozjy9XpXWCgIOYe X-Received: by 2002:a17:90a:d0c4:b0:1bc:b02e:ed75 with SMTP id y4-20020a17090ad0c400b001bcb02eed75mr1502584pjw.104.1647902570975; Mon, 21 Mar 2022 15:42:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647902570; cv=none; d=google.com; s=arc-20160816; b=Sux2hxxWdDDpwcPZZeZqzwm4G1BIODJ9AQ+PyDbZGRqyuuRkVUsoZj1S+1No+Suhf1 aT3nYllUjaw2+JhW0IiqR2xMtpD9y18I6Z/UnjMOKp9rAy2tYdEm8mM5iyOVbENsUKEj 7DkplSFe9U1t0K858ena8iEGyWUzSCMXbPS5GV46BtNyktfPjYrCDvw9kA+xxFOni6q6 ILdJImxdR/oDi+lDKGnCqJnwYWtl/lhArsAiUNvBuwAAPt5P1UY6CWfX778SKqxXYlAI pd4H08osW9J8ctTjbgzUGLnGyGbccyGvgvLZfCSwaKW5V1r180HNtiNb88WkTIqBM6IS Fxsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=2koU9eUC0sosP5fb70SNKNvUvxzlAfqY4XAuaRf+3BM=; b=1LP09+gHT/KW0HSQspCs6QkcWP8tZ0YFnhF4a/leC+pW9Hm3Bwxif6ucaanLZ8PBZj ihsaZ/Am6uNoZxgxWFmacWnX0gT0OSQJzFj3cFvlp6pFmAZ9Fb733cDsnKUgkCiOX29S 9P4B0Dn4H9S0vFMjTl/bCHM3BnnW8+BFe/4pp7CQr2ies6oMGrF3iMUOoiPLkBUHbDgK 0giA6Q6SWzJ1OJZlWxWLVWR0FWCnQvTYGsZtfCayLOdKiNERGnO8iJ3eG2iW/OrUinHG he9hD90vcPhYTOXFws7fIBBsojG+tTc6pO2o6mnhtHS5Gzo1U18C8sMgD3Doz0NsnjlC wDFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20210112.gappssmtp.com header.s=20210112 header.b=nm4JEFKv; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id 189-20020a6204c6000000b004fa3a8dffd5si8561668pfe.140.2022.03.21.15.42.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Mar 2022 15:42:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20210112.gappssmtp.com header.s=20210112 header.b=nm4JEFKv; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0C3C72ECF8E; Mon, 21 Mar 2022 14:55:57 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352940AbiCUUKB (ORCPT + 99 others); Mon, 21 Mar 2022 16:10:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44458 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352991AbiCUUJl (ORCPT ); Mon, 21 Mar 2022 16:09:41 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC87F1066CD for ; Mon, 21 Mar 2022 13:08:01 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id u16so21214586wru.4 for ; Mon, 21 Mar 2022 13:08:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2koU9eUC0sosP5fb70SNKNvUvxzlAfqY4XAuaRf+3BM=; b=nm4JEFKv1ExN1Yho426sggi0XyhrT+8dhyjrwKK1msCHIWs1SIk4Kb8qMUCV55Itii g9lqsAXZi29gfQF7o5okjJcW/2A1yzHT0qXUWXCtEGgMYeLId08PQuzx151jmjjTGDrZ ybIVXhyIeOURG9ya5EtiEgCvUa0AF8JyZPs1FAjjEKIaVr+/GtO+smSoJeWXrAw9c+3m sck7SM8Ro5gIsTpECT4taI3XZ7KkcmZyOMwX3nAt3su5qacTWqTYfXLiizBxvUSMoYJf h6mPfnHdKd47AZrHpn2B3sZUDQDIHJy+OrqQEFkYsajNGSFCoe618lt4tXlEklSqJ9sg WDpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2koU9eUC0sosP5fb70SNKNvUvxzlAfqY4XAuaRf+3BM=; b=T8yG1zY9oKkS4By4j18r/huBXX5H2KLKsvpSb1b4zm7wgPgY3ykmt+vJ7AERSm7SMV TXCRrjh8tbs1Bj58Pq3NwjVQeDzOyE1YQXZ2XSaI5CA1P5RUmwksxZ5JLtad6Ty5FdKy GNA7sBeMVTPK4wqrKOVv5mjvUr/Hp5azZusBl90UYEnJCXKXmH5/et0eAbqYV+K8mlKG /LfxcncJxG2TkVWDL6B+ZpEapmAadQM4LHMa2lNFYNF64rI1yVyLsydrJWRbQ+ShbgNb rL3JeaT8zlglabtP0sSDDXfu0tACLBA8+Yp6Qt+UcQbfZrMuO+GWrfyhfcQ0cZyFN0Ir iB/Q== X-Gm-Message-State: AOAM532RKaVolP0RiR2UzrrCQ534aJqUYzu2Wjlo9QKLWnSEy0zAzsa0 +KdhSBVqU48tzyNfVSgZScxFrLFfcPnTdg== X-Received: by 2002:a05:6000:1363:b0:203:d731:a19 with SMTP id q3-20020a056000136300b00203d7310a19mr20231181wrz.322.1647893279501; Mon, 21 Mar 2022 13:07:59 -0700 (PDT) Received: from localhost.localdomain (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.googlemail.com with ESMTPSA id i14-20020a0560001ace00b00203da1fa749sm24426988wry.72.2022.03.21.13.07.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Mar 2022 13:07:59 -0700 (PDT) From: Corentin Labbe To: heiko@sntech.de, herbert@gondor.apana.org.au, krzk+dt@kernel.org, mturquette@baylibre.com, robh+dt@kernel.org, sboyd@kernel.org Cc: devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, Corentin Labbe Subject: [PATCH v3 13/26] crypto: rockchip: introduce PM Date: Mon, 21 Mar 2022 20:07:26 +0000 Message-Id: <20220321200739.3572792-14-clabbe@baylibre.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220321200739.3572792-1-clabbe@baylibre.com> References: <20220321200739.3572792-1-clabbe@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Add runtime PM support for rockchip crypto. Signed-off-by: Corentin Labbe --- drivers/crypto/rockchip/rk3288_crypto.c | 51 ++++++++++++++++++- drivers/crypto/rockchip/rk3288_crypto.h | 1 + drivers/crypto/rockchip/rk3288_crypto_ahash.c | 10 ++++ .../crypto/rockchip/rk3288_crypto_skcipher.c | 9 ++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/rockchip/rk3288_crypto.c b/drivers/crypto/rockchip/rk3288_crypto.c index 3e1b4f3b2422..d9258b9e71b3 100644 --- a/drivers/crypto/rockchip/rk3288_crypto.c +++ b/drivers/crypto/rockchip/rk3288_crypto.c @@ -65,6 +65,48 @@ static void rk_crypto_disable_clk(struct rk_crypto_info *dev) clk_disable_unprepare(dev->sclk); } +/* + * Power management strategy: The device is suspended unless a TFM exists for + * one of the algorithms proposed by this driver. + */ +static int rk_crypto_pm_suspend(struct device *dev) +{ + struct rk_crypto_info *rkdev = dev_get_drvdata(dev); + + rk_crypto_disable_clk(rkdev); + return 0; +} + +static int rk_crypto_pm_resume(struct device *dev) +{ + struct rk_crypto_info *rkdev = dev_get_drvdata(dev); + + return rk_crypto_enable_clk(rkdev); +} + +static const struct dev_pm_ops rk_crypto_pm_ops = { + SET_RUNTIME_PM_OPS(rk_crypto_pm_suspend, rk_crypto_pm_resume, NULL) +}; + +static int rk_crypto_pm_init(struct rk_crypto_info *rkdev) +{ + int err; + + pm_runtime_use_autosuspend(rkdev->dev); + pm_runtime_set_autosuspend_delay(rkdev->dev, 2000); + + err = pm_runtime_set_suspended(rkdev->dev); + if (err) + return err; + pm_runtime_enable(rkdev->dev); + return err; +} + +static void rk_crypto_pm_exit(struct rk_crypto_info *rkdev) +{ + pm_runtime_disable(rkdev->dev); +} + static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id) { struct rk_crypto_info *dev = platform_get_drvdata(dev_id); @@ -273,7 +315,9 @@ static int rk_crypto_probe(struct platform_device *pdev) crypto_engine_start(crypto_info->engine); init_completion(&crypto_info->complete); - rk_crypto_enable_clk(crypto_info); + err = rk_crypto_pm_init(crypto_info); + if (err) + goto err_pm; err = rk_crypto_register(crypto_info); if (err) { @@ -294,6 +338,8 @@ static int rk_crypto_probe(struct platform_device *pdev) return 0; err_register_alg: + rk_crypto_pm_exit(crypto_info); +err_pm: crypto_engine_exit(crypto_info->engine); err_crypto: dev_err(dev, "Crypto Accelerator not successfully registered\n"); @@ -308,7 +354,7 @@ static int rk_crypto_remove(struct platform_device *pdev) debugfs_remove_recursive(crypto_tmp->dbgfs_dir); #endif rk_crypto_unregister(); - rk_crypto_disable_clk(crypto_tmp); + rk_crypto_pm_exit(crypto_tmp); crypto_engine_exit(crypto_tmp->engine); return 0; } @@ -318,6 +364,7 @@ static struct platform_driver crypto_driver = { .remove = rk_crypto_remove, .driver = { .name = "rk3288-crypto", + .pm = &rk_crypto_pm_ops, .of_match_table = crypto_of_id_table, }, }; diff --git a/drivers/crypto/rockchip/rk3288_crypto.h b/drivers/crypto/rockchip/rk3288_crypto.h index f85144e3d124..6a1f09d409bf 100644 --- a/drivers/crypto/rockchip/rk3288_crypto.h +++ b/drivers/crypto/rockchip/rk3288_crypto.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/drivers/crypto/rockchip/rk3288_crypto_ahash.c b/drivers/crypto/rockchip/rk3288_crypto_ahash.c index 8856c6226be6..137013bd4410 100644 --- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c +++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c @@ -328,6 +328,7 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm) struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg); const char *alg_name = crypto_tfm_alg_name(tfm); + int err; algt = container_of(alg, struct rk_crypto_tmp, alg.hash); @@ -349,7 +350,15 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm) tctx->enginectx.op.prepare_request = rk_hash_prepare; tctx->enginectx.op.unprepare_request = rk_hash_unprepare; + err = pm_runtime_resume_and_get(tctx->dev->dev); + if (err < 0) + goto error_pm; + return 0; +error_pm: + crypto_free_ahash(tctx->fallback_tfm); + + return err; } static void rk_cra_hash_exit(struct crypto_tfm *tfm) @@ -357,6 +366,7 @@ static void rk_cra_hash_exit(struct crypto_tfm *tfm) struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm); crypto_free_ahash(tctx->fallback_tfm); + pm_runtime_put_autosuspend(tctx->dev->dev); } struct rk_crypto_tmp rk_ahash_sha1 = { diff --git a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c index 4ff08238156b..8d3a60db0cf6 100644 --- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c +++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c @@ -466,6 +466,7 @@ static int rk_ablk_init_tfm(struct crypto_skcipher *tfm) struct skcipher_alg *alg = crypto_skcipher_alg(tfm); const char *name = crypto_tfm_alg_name(&tfm->base); struct rk_crypto_tmp *algt; + int err; algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); @@ -483,7 +484,14 @@ static int rk_ablk_init_tfm(struct crypto_skcipher *tfm) ctx->enginectx.op.do_one_request = rk_cipher_run; + err = pm_runtime_resume_and_get(ctx->dev->dev); + if (err < 0) + goto error_pm; + return 0; +error_pm: + crypto_free_skcipher(ctx->fallback_tfm); + return err; } static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm) @@ -492,6 +500,7 @@ static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm) memzero_explicit(ctx->key, ctx->keylen); crypto_free_skcipher(ctx->fallback_tfm); + pm_runtime_put_autosuspend(ctx->dev->dev); } struct rk_crypto_tmp rk_ecb_aes_alg = { -- 2.34.1