]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: caam - add missing put_device() call
authorWen Yang <yellowriver2010@hotmail.com>
Fri, 1 Mar 2019 17:19:25 +0000 (19:19 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 7 Mar 2019 08:24:52 +0000 (16:24 +0800)
The of_find_device_by_node() takes a reference to the underlying device
structure, we should release that reference.

Fixes: 35af64038623 ("crypto: caam - Check for CAAM block presence before registering with crypto layer")
Fixes: b189817cf789 ("crypto: caam/qi - add ablkcipher and authenc algorithms")
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Wen Yang <yellowriver2010@hotmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamalg.c
drivers/crypto/caam/caamalg_qi.c
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/caampkc.c
drivers/crypto/caam/caamrng.c

index 9eac5099098ef274fa40200eb15629e0ad8d8b09..579578498debba63f5bbe9efa54b872fc1da1c18 100644 (file)
@@ -3455,7 +3455,6 @@ static int __init caam_algapi_init(void)
 {
        struct device_node *dev_node;
        struct platform_device *pdev;
-       struct device *ctrldev;
        struct caam_drv_private *priv;
        int i = 0, err = 0;
        u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst;
@@ -3476,16 +3475,17 @@ static int __init caam_algapi_init(void)
                return -ENODEV;
        }
 
-       ctrldev = &pdev->dev;
-       priv = dev_get_drvdata(ctrldev);
+       priv = dev_get_drvdata(&pdev->dev);
        of_node_put(dev_node);
 
        /*
         * If priv is NULL, it's probably because the caam driver wasn't
         * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
         */
-       if (!priv)
-               return -ENODEV;
+       if (!priv) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
 
        /*
@@ -3626,6 +3626,8 @@ static int __init caam_algapi_init(void)
        if (registered)
                pr_info("caam algorithms registered in /proc/crypto\n");
 
+out_put_dev:
+       put_device(&pdev->dev);
        return err;
 }
 
index a15ce9213310558a6b4c7e22469499b05d9347e7..c61921d32489a53386d4eafaf258150bff1bd368 100644 (file)
@@ -2492,12 +2492,15 @@ static int __init caam_qi_algapi_init(void)
         * If priv is NULL, it's probably because the caam driver wasn't
         * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
         */
-       if (!priv || !priv->qi_present)
-               return -ENODEV;
+       if (!priv || !priv->qi_present) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        if (caam_dpaa2) {
                dev_info(ctrldev, "caam/qi frontend driver not suitable for DPAA 2.x, aborting...\n");
-               return -ENODEV;
+               err = -ENODEV;
+               goto out_put_dev;
        }
 
        /*
@@ -2610,6 +2613,8 @@ static int __init caam_qi_algapi_init(void)
        if (registered)
                dev_info(priv->qidev, "algorithms registered in /proc/crypto\n");
 
+out_put_dev:
+       put_device(ctrldev);
        return err;
 }
 
index d7483e4d0ce2d592abbda77bd8afa99ab3e57457..b1eadc6652b5f236897811357bd49ac364498f5e 100644 (file)
@@ -1993,7 +1993,6 @@ static int __init caam_algapi_hash_init(void)
 {
        struct device_node *dev_node;
        struct platform_device *pdev;
-       struct device *ctrldev;
        int i = 0, err = 0;
        struct caam_drv_private *priv;
        unsigned int md_limit = SHA512_DIGEST_SIZE;
@@ -2012,16 +2011,17 @@ static int __init caam_algapi_hash_init(void)
                return -ENODEV;
        }
 
-       ctrldev = &pdev->dev;
-       priv = dev_get_drvdata(ctrldev);
+       priv = dev_get_drvdata(&pdev->dev);
        of_node_put(dev_node);
 
        /*
         * If priv is NULL, it's probably because the caam driver wasn't
         * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
         */
-       if (!priv)
-               return -ENODEV;
+       if (!priv) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        /*
         * Register crypto algorithms the device supports.  First, identify
@@ -2043,8 +2043,10 @@ static int __init caam_algapi_hash_init(void)
         * Skip registration of any hashing algorithms if MD block
         * is not present.
         */
-       if (!md_inst)
-               return -ENODEV;
+       if (!md_inst) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        /* Limit digest size based on LP256 */
        if (md_vid == CHA_VER_VID_MD_LP256)
@@ -2101,6 +2103,8 @@ static int __init caam_algapi_hash_init(void)
                        list_add_tail(&t_alg->entry, &hash_list);
        }
 
+out_put_dev:
+       put_device(&pdev->dev);
        return err;
 }
 
index 77ab28a2811a60aacd65329606e5fcc314ffd3d9..58285642306ed364fe7c2fe8d4e10d8625d76767 100644 (file)
@@ -1042,8 +1042,10 @@ static int __init caam_pkc_init(void)
         * If priv is NULL, it's probably because the caam driver wasn't
         * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
         */
-       if (!priv)
-               return -ENODEV;
+       if (!priv) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        /* Determine public key hardware accelerator presence. */
        if (priv->era < 10)
@@ -1053,8 +1055,10 @@ static int __init caam_pkc_init(void)
                pk_inst = rd_reg32(&priv->ctrl->vreg.pkha) & CHA_VER_NUM_MASK;
 
        /* Do not register algorithms if PKHA is not present. */
-       if (!pk_inst)
-               return -ENODEV;
+       if (!pk_inst) {
+               err =  -ENODEV;
+               goto out_put_dev;
+       }
 
        err = crypto_register_akcipher(&caam_rsa);
        if (err)
@@ -1063,6 +1067,8 @@ static int __init caam_pkc_init(void)
        else
                dev_info(ctrldev, "caam pkc algorithms registered in /proc/crypto\n");
 
+out_put_dev:
+       put_device(ctrldev);
        return err;
 }
 
index a387c8d49a62d775617f867465a53a0404f8bc87..95eb5402c59f66185223b5a9d9b63a64b5019d3f 100644 (file)
@@ -308,7 +308,6 @@ static int __init caam_rng_init(void)
        struct device *dev;
        struct device_node *dev_node;
        struct platform_device *pdev;
-       struct device *ctrldev;
        struct caam_drv_private *priv;
        u32 rng_inst;
        int err;
@@ -326,16 +325,17 @@ static int __init caam_rng_init(void)
                return -ENODEV;
        }
 
-       ctrldev = &pdev->dev;
-       priv = dev_get_drvdata(ctrldev);
+       priv = dev_get_drvdata(&pdev->dev);
        of_node_put(dev_node);
 
        /*
         * If priv is NULL, it's probably because the caam driver wasn't
         * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
         */
-       if (!priv)
-               return -ENODEV;
+       if (!priv) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        /* Check for an instantiated RNG before registration */
        if (priv->era < 10)
@@ -344,13 +344,16 @@ static int __init caam_rng_init(void)
        else
                rng_inst = rd_reg32(&priv->ctrl->vreg.rng) & CHA_VER_NUM_MASK;
 
-       if (!rng_inst)
-               return -ENODEV;
+       if (!rng_inst) {
+               err = -ENODEV;
+               goto out_put_dev;
+       }
 
        dev = caam_jr_alloc();
        if (IS_ERR(dev)) {
                pr_err("Job Ring Device allocation for transform failed\n");
-               return PTR_ERR(dev);
+               err = PTR_ERR(dev);
+               goto out_put_dev;
        }
        rng_ctx = kmalloc(sizeof(*rng_ctx), GFP_DMA | GFP_KERNEL);
        if (!rng_ctx) {
@@ -361,6 +364,7 @@ static int __init caam_rng_init(void)
        if (err)
                goto free_rng_ctx;
 
+       put_device(&pdev->dev);
        dev_info(dev, "registering rng-caam\n");
        return hwrng_register(&caam_rng);
 
@@ -368,6 +372,8 @@ static int __init caam_rng_init(void)
        kfree(rng_ctx);
 free_caam_alloc:
        caam_jr_free(dev);
+out_put_dev:
+       put_device(&pdev->dev);
        return err;
 }