crypto: caam - Fix job ring discovery in controller driver
authorNitesh Lal <NiteshNarayanLal@freescale.com>
Sun, 9 Feb 2014 01:59:13 +0000 (09:59 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 9 Feb 2014 01:59:13 +0000 (09:59 +0800)
The SEC Controller driver creates platform devices for it's child job ring nodes.
Currently the driver uses for_each_compatible routine which traverses
the whole device tree to create the job rings for the platform device.
The patch changes this to search for the compatible property of job ring
only in the child nodes i.e., the job rings are created as per the number
of children associated with the crypto node.

Signed-off-by: Nitesh Lal <NiteshNarayanLal@freescale.com>
Reviewed-by: Horia Geanta <horia.geanta@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/ctrl.c

index 63fb1af2c43187fe398663869b5877fa16bf8834..30f434fd5deca5e386dc3254f70f89508144f521 100644 (file)
@@ -443,13 +443,10 @@ static int caam_probe(struct platform_device *pdev)
         * for all, then go probe each one.
         */
        rspec = 0;
-       for_each_compatible_node(np, NULL, "fsl,sec-v4.0-job-ring")
-               rspec++;
-       if (!rspec) {
-               /* for backward compatible with device trees */
-               for_each_compatible_node(np, NULL, "fsl,sec4.0-job-ring")
+       for_each_available_child_of_node(nprop, np)
+               if (of_device_is_compatible(np, "fsl,sec-v4.0-job-ring") ||
+                   of_device_is_compatible(np, "fsl,sec4.0-job-ring"))
                        rspec++;
-       }
 
        ctrlpriv->jrpdev = kzalloc(sizeof(struct platform_device *) * rspec,
                                                                GFP_KERNEL);
@@ -460,18 +457,9 @@ static int caam_probe(struct platform_device *pdev)
 
        ring = 0;
        ctrlpriv->total_jobrs = 0;
-       for_each_compatible_node(np, NULL, "fsl,sec-v4.0-job-ring") {
-               ctrlpriv->jrpdev[ring] =
-                               of_platform_device_create(np, NULL, dev);
-               if (!ctrlpriv->jrpdev[ring]) {
-                       pr_warn("JR%d Platform device creation error\n", ring);
-                       continue;
-               }
-               ctrlpriv->total_jobrs++;
-               ring++;
-       }
-       if (!ring) {
-               for_each_compatible_node(np, NULL, "fsl,sec4.0-job-ring") {
+       for_each_available_child_of_node(nprop, np)
+               if (of_device_is_compatible(np, "fsl,sec-v4.0-job-ring") ||
+                   of_device_is_compatible(np, "fsl,sec4.0-job-ring")) {
                        ctrlpriv->jrpdev[ring] =
                                of_platform_device_create(np, NULL, dev);
                        if (!ctrlpriv->jrpdev[ring]) {
@@ -482,7 +470,6 @@ static int caam_probe(struct platform_device *pdev)
                        ctrlpriv->total_jobrs++;
                        ring++;
                }
-       }
 
        /* Check to see if QI present. If so, enable */
        ctrlpriv->qi_present = !!(rd_reg64(&topregs->ctrl.perfmon.comp_parms) &