crypto: caam - use devres to de-initialize the RNG
authorAndrey Smirnov <andrew.smirnov@gmail.com>
Tue, 22 Oct 2019 15:30:10 +0000 (08:30 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Nov 2019 05:38:30 +0000 (13:38 +0800)
Use devres to de-initialize the RNG and drop explicit de-initialization
code in caam_remove().

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Horia Geantă <horia.geanta@nxp.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Iuliana Prodan <iuliana.prodan@nxp.com>
Cc: linux-crypto@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/ctrl.c

index 254963498abcf4a1c034f3affa4a0c5855fd9de1..f8c75a9999137d35aa00481d02b701d0d24987c5 100644 (file)
@@ -175,6 +175,73 @@ static inline int run_descriptor_deco0(struct device *ctrldev, u32 *desc,
        return 0;
 }
 
+/*
+ * deinstantiate_rng - builds and executes a descriptor on DECO0,
+ *                    which deinitializes the RNG block.
+ * @ctrldev - pointer to device
+ * @state_handle_mask - bitmask containing the instantiation status
+ *                     for the RNG4 state handles which exist in
+ *                     the RNG4 block: 1 if it's been instantiated
+ *
+ * Return: - 0 if no error occurred
+ *        - -ENOMEM if there isn't enough memory to allocate the descriptor
+ *        - -ENODEV if DECO0 couldn't be acquired
+ *        - -EAGAIN if an error occurred when executing the descriptor
+ */
+static int deinstantiate_rng(struct device *ctrldev, int state_handle_mask)
+{
+       u32 *desc, status;
+       int sh_idx, ret = 0;
+
+       desc = kmalloc(CAAM_CMD_SZ * 3, GFP_KERNEL);
+       if (!desc)
+               return -ENOMEM;
+
+       for (sh_idx = 0; sh_idx < RNG4_MAX_HANDLES; sh_idx++) {
+               /*
+                * If the corresponding bit is set, then it means the state
+                * handle was initialized by us, and thus it needs to be
+                * deinitialized as well
+                */
+               if ((1 << sh_idx) & state_handle_mask) {
+                       /*
+                        * Create the descriptor for deinstantating this state
+                        * handle
+                        */
+                       build_deinstantiation_desc(desc, sh_idx);
+
+                       /* Try to run it through DECO0 */
+                       ret = run_descriptor_deco0(ctrldev, desc, &status);
+
+                       if (ret ||
+                           (status && status != JRSTA_SSRC_JUMP_HALT_CC)) {
+                               dev_err(ctrldev,
+                                       "Failed to deinstantiate RNG4 SH%d\n",
+                                       sh_idx);
+                               break;
+                       }
+                       dev_info(ctrldev, "Deinstantiated RNG4 SH%d\n", sh_idx);
+               }
+       }
+
+       kfree(desc);
+
+       return ret;
+}
+
+static void devm_deinstantiate_rng(void *data)
+{
+       struct device *ctrldev = data;
+       struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev);
+
+       /*
+        * De-initialize RNG state handles initialized by this driver.
+        * In case of SoCs with Management Complex, RNG is managed by MC f/w.
+        */
+       if (ctrlpriv->rng4_sh_init)
+               deinstantiate_rng(ctrldev, ctrlpriv->rng4_sh_init);
+}
+
 /*
  * instantiate_rng - builds and executes a descriptor on DECO0,
  *                  which initializes the RNG block.
@@ -247,59 +314,9 @@ static int instantiate_rng(struct device *ctrldev, int state_handle_mask,
 
        kfree(desc);
 
-       return ret;
-}
-
-/*
- * deinstantiate_rng - builds and executes a descriptor on DECO0,
- *                    which deinitializes the RNG block.
- * @ctrldev - pointer to device
- * @state_handle_mask - bitmask containing the instantiation status
- *                     for the RNG4 state handles which exist in
- *                     the RNG4 block: 1 if it's been instantiated
- *
- * Return: - 0 if no error occurred
- *        - -ENOMEM if there isn't enough memory to allocate the descriptor
- *        - -ENODEV if DECO0 couldn't be acquired
- *        - -EAGAIN if an error occurred when executing the descriptor
- */
-static int deinstantiate_rng(struct device *ctrldev, int state_handle_mask)
-{
-       u32 *desc, status;
-       int sh_idx, ret = 0;
-
-       desc = kmalloc(CAAM_CMD_SZ * 3, GFP_KERNEL);
-       if (!desc)
-               return -ENOMEM;
-
-       for (sh_idx = 0; sh_idx < RNG4_MAX_HANDLES; sh_idx++) {
-               /*
-                * If the corresponding bit is set, then it means the state
-                * handle was initialized by us, and thus it needs to be
-                * deinitialized as well
-                */
-               if ((1 << sh_idx) & state_handle_mask) {
-                       /*
-                        * Create the descriptor for deinstantating this state
-                        * handle
-                        */
-                       build_deinstantiation_desc(desc, sh_idx);
-
-                       /* Try to run it through DECO0 */
-                       ret = run_descriptor_deco0(ctrldev, desc, &status);
-
-                       if (ret ||
-                           (status && status != JRSTA_SSRC_JUMP_HALT_CC)) {
-                               dev_err(ctrldev,
-                                       "Failed to deinstantiate RNG4 SH%d\n",
-                                       sh_idx);
-                               break;
-                       }
-                       dev_info(ctrldev, "Deinstantiated RNG4 SH%d\n", sh_idx);
-               }
-       }
-
-       kfree(desc);
+       if (!ret)
+               ret = devm_add_action_or_reset(ctrldev, devm_deinstantiate_rng,
+                                              ctrldev);
 
        return ret;
 }
@@ -320,13 +337,6 @@ static int caam_remove(struct platform_device *pdev)
                caam_qi_shutdown(ctrldev);
 #endif
 
-       /*
-        * De-initialize RNG state handles initialized by this driver.
-        * In case of SoCs with Management Complex, RNG is managed by MC f/w.
-        */
-       if (!ctrlpriv->mc_en && ctrlpriv->rng4_sh_init)
-               deinstantiate_rng(ctrldev, ctrlpriv->rng4_sh_init);
-
        return 0;
 }