crypto: amcc - Hold the reference returned by of_find_compatible_node
authorLiang He <windhl@126.com>
Thu, 30 Jun 2022 08:36:56 +0000 (16:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 8 Jul 2022 07:21:16 +0000 (15:21 +0800)
In crypto4xx_probe(), we should hold the reference returned by
of_find_compatible_node() and use it to call of_node_put to keep
 refcount balance.

Signed-off-by: Liang He <windhl@126.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/amcc/crypto4xx_core.c

index 8278d98..280f4b0 100644 (file)
@@ -1378,6 +1378,7 @@ static int crypto4xx_probe(struct platform_device *ofdev)
        struct resource res;
        struct device *dev = &ofdev->dev;
        struct crypto4xx_core_device *core_dev;
+       struct device_node *np;
        u32 pvr;
        bool is_revb = true;
 
@@ -1385,29 +1386,36 @@ static int crypto4xx_probe(struct platform_device *ofdev)
        if (rc)
                return -ENODEV;
 
-       if (of_find_compatible_node(NULL, NULL, "amcc,ppc460ex-crypto")) {
+       np = of_find_compatible_node(NULL, NULL, "amcc,ppc460ex-crypto");
+       if (np) {
                mtdcri(SDR0, PPC460EX_SDR0_SRST,
                       mfdcri(SDR0, PPC460EX_SDR0_SRST) | PPC460EX_CE_RESET);
                mtdcri(SDR0, PPC460EX_SDR0_SRST,
                       mfdcri(SDR0, PPC460EX_SDR0_SRST) & ~PPC460EX_CE_RESET);
-       } else if (of_find_compatible_node(NULL, NULL,
-                       "amcc,ppc405ex-crypto")) {
-               mtdcri(SDR0, PPC405EX_SDR0_SRST,
-                      mfdcri(SDR0, PPC405EX_SDR0_SRST) | PPC405EX_CE_RESET);
-               mtdcri(SDR0, PPC405EX_SDR0_SRST,
-                      mfdcri(SDR0, PPC405EX_SDR0_SRST) & ~PPC405EX_CE_RESET);
-               is_revb = false;
-       } else if (of_find_compatible_node(NULL, NULL,
-                       "amcc,ppc460sx-crypto")) {
-               mtdcri(SDR0, PPC460SX_SDR0_SRST,
-                      mfdcri(SDR0, PPC460SX_SDR0_SRST) | PPC460SX_CE_RESET);
-               mtdcri(SDR0, PPC460SX_SDR0_SRST,
-                      mfdcri(SDR0, PPC460SX_SDR0_SRST) & ~PPC460SX_CE_RESET);
        } else {
-               printk(KERN_ERR "Crypto Function Not supported!\n");
-               return -EINVAL;
+               np = of_find_compatible_node(NULL, NULL, "amcc,ppc405ex-crypto");
+               if (np) {
+                       mtdcri(SDR0, PPC405EX_SDR0_SRST,
+                                  mfdcri(SDR0, PPC405EX_SDR0_SRST) | PPC405EX_CE_RESET);
+                       mtdcri(SDR0, PPC405EX_SDR0_SRST,
+                                  mfdcri(SDR0, PPC405EX_SDR0_SRST) & ~PPC405EX_CE_RESET);
+                       is_revb = false;
+               } else {
+                       np = of_find_compatible_node(NULL, NULL, "amcc,ppc460sx-crypto");
+                       if (np) {
+                               mtdcri(SDR0, PPC460SX_SDR0_SRST,
+                                       mfdcri(SDR0, PPC460SX_SDR0_SRST) | PPC460SX_CE_RESET);
+                               mtdcri(SDR0, PPC460SX_SDR0_SRST,
+                                       mfdcri(SDR0, PPC460SX_SDR0_SRST) & ~PPC460SX_CE_RESET);
+                       } else {
+                               printk(KERN_ERR "Crypto Function Not supported!\n");
+                               return -EINVAL;
+                       }
+               }
        }
 
+       of_node_put(np);
+
        core_dev = kzalloc(sizeof(struct crypto4xx_core_device), GFP_KERNEL);
        if (!core_dev)
                return -ENOMEM;