From patchwork Tue Jul 4 17:32:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Kaiser X-Patchwork-Id: 115878 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f45:0:b0:3ea:f831:8777 with SMTP id v5csp1379809vqx; Tue, 4 Jul 2023 10:54:46 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4Wb0w2t8Hp4PoRyEhrGdXcFMwgFNbwyaEF8PIC0o2JqpAD9YyLau2E7gFssKY9m2gFWKcB X-Received: by 2002:a05:6808:2214:b0:3a2:a96d:19c3 with SMTP id bd20-20020a056808221400b003a2a96d19c3mr21273306oib.41.1688493286422; Tue, 04 Jul 2023 10:54:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688493286; cv=none; d=google.com; s=arc-20160816; b=Mh48vNF9Ock+Qjuo4fh8s9RMICII0jFKeMobg2/HVishihHnKzrlFs1REUMM+zQGjO tswnU0DX7vbC13svQ6YEYil6+2F15Pymd3QCycUwsf1R8n8v28hov2KOxWuk0PCyBHl4 EU7qxzDbOl9Zv07br+2NWyJLThclAqxwrDV2pdxO3EkXp5C8YfIou1R3f7hoGf9BSWA9 61CHVVkqbK+KY6xU4/k44vTE+wIphee1etSp7SVva3a4bXqGu7HaAlQdjE9nohGrKLJe 9bnk9lZZdvBkq0uXsXe0HU1tbaW7kmQCwLoFUv1Niva1S/HIPAJufViqUxB7VKujZWck 6v2A== 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; bh=L0mlBbI5UB7EJYxVbUVi/DPMd4wx2nWfxdmLFKK5fP4=; fh=lO4wmMQhvm8y/jaHDv9dt1CS5yb5ZTFKyt5xlt/d/d8=; b=UP6QrQoL4rzadh7FV8yyO1mWaAd6Ho2865PymTCmTyVC/Qk56TaE+KjmpUxQN46pez 0DJ/AqhbpXaZsb+eNLIY7QQaswk8wWqS2FccM2fM9c3Xa2MJrczulrOdiqodTy/F0NHI YCfREvPx5QVc9TG0qF0hoiZh7DqZC9Fg7R3NRM1i6V+4KG3nbV6j2GlYfwqd0AlJCIQ2 oSOphliXc01s6G35OgnKz92I4X5ewq7rkb8XBhCYil2e8nM1jZrIPEnSb0jt4LkgK1JY l1NW7ckY5PpvOzXRAm0mtIzWeJVa7UU9rTH+WtPsq1cbQrOTmyvwlIcrZkL3em9GJn07 exeg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o14-20020a635d4e000000b0053ff2ca1b24si21232316pgm.843.2023.07.04.10.54.31; Tue, 04 Jul 2023 10:54:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231739AbjGDReB (ORCPT + 99 others); Tue, 4 Jul 2023 13:34:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42108 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231455AbjGDRdy (ORCPT ); Tue, 4 Jul 2023 13:33:54 -0400 Received: from viti.kaiser.cx (viti.kaiser.cx [IPv6:2a01:238:43fe:e600:cd0c:bd4a:7a3:8e9f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9C94DA; Tue, 4 Jul 2023 10:33:52 -0700 (PDT) Received: from ipservice-092-217-072-126.092.217.pools.vodafone-ip.de ([92.217.72.126] helo=martin-debian-2.paytec.ch) by viti.kaiser.cx with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1qGjuP-0000yT-Uj; Tue, 04 Jul 2023 19:33:50 +0200 From: Martin Kaiser To: Herbert Xu Cc: Joshua Henderson , linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Martin Kaiser Subject: [PATCH 4/4] hwrng: pic32 - enable TRNG only while it's used Date: Tue, 4 Jul 2023 19:32:03 +0200 Message-Id: <20230704173203.70706-5-martin@kaiser.cx> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230704173203.70706-1-martin@kaiser.cx> References: <20230704173203.70706-1-martin@kaiser.cx> MIME-Version: 1.0 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham 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-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1770513536146635285?= X-GMAIL-MSGID: =?utf-8?q?1770513536146635285?= The probe function enables the TRNG hardware before registering the driver. If registration fails, probe returns an error, but the TRNG remains enabled. Define init and cleanup functions, enable and disable the hardware there. Signed-off-by: Martin Kaiser --- drivers/char/hw_random/pic32-rng.c | 41 ++++++++++++++---------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/drivers/char/hw_random/pic32-rng.c b/drivers/char/hw_random/pic32-rng.c index c1b3f5915f03..1902f4389a3f 100644 --- a/drivers/char/hw_random/pic32-rng.c +++ b/drivers/char/hw_random/pic32-rng.c @@ -38,6 +38,15 @@ struct pic32_rng { */ #define RNG_TIMEOUT 500 +static int pic32_rng_init(struct hwrng *rng) +{ + struct pic32_rng *priv = container_of(rng, struct pic32_rng, rng); + + /* enable TRNG in enhanced mode */ + writel(TRNGEN | TRNGMOD, priv->base + RNGCON); + return 0; +} + static int pic32_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) { @@ -59,12 +68,17 @@ static int pic32_rng_read(struct hwrng *rng, void *buf, size_t max, return -EIO; } +static void pic32_rng_cleanup(struct hwrng *rng) +{ + struct pic32_rng *priv = container_of(rng, struct pic32_rng, rng); + + writel(0, priv->base + RNGCON); +} + static int pic32_rng_probe(struct platform_device *pdev) { struct pic32_rng *priv; struct clk *clk; - u32 v; - int ret; priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); if (!priv) @@ -78,28 +92,12 @@ static int pic32_rng_probe(struct platform_device *pdev) if (IS_ERR(clk)) return PTR_ERR(clk); - /* enable TRNG in enhanced mode */ - v = TRNGEN | TRNGMOD; - writel(v, priv->base + RNGCON); - priv->rng.name = pdev->name; + priv->rng.init = pic32_rng_init; priv->rng.read = pic32_rng_read; + priv->rng.cleanup = pic32_rng_cleanup; - ret = devm_hwrng_register(&pdev->dev, &priv->rng); - if (ret) - return ret; - - platform_set_drvdata(pdev, priv); - - return 0; -} - -static int pic32_rng_remove(struct platform_device *pdev) -{ - struct pic32_rng *rng = platform_get_drvdata(pdev); - - writel(0, rng->base + RNGCON); - return 0; + return devm_hwrng_register(&pdev->dev, &priv->rng); } static const struct of_device_id pic32_rng_of_match[] __maybe_unused = { @@ -110,7 +108,6 @@ MODULE_DEVICE_TABLE(of, pic32_rng_of_match); static struct platform_driver pic32_rng_driver = { .probe = pic32_rng_probe, - .remove = pic32_rng_remove, .driver = { .name = "pic32-rng", .of_match_table = of_match_ptr(pic32_rng_of_match),