OSDN Git Service

crypto: crypto4xx - shuffle iomap in front of request_irq
authorChristian Lamparter <chunkeey@gmail.com>
Fri, 22 Dec 2017 20:18:35 +0000 (21:18 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 5 Jan 2018 07:43:02 +0000 (18:43 +1100)
It is possible to avoid the ce_base null pointer check in the
drivers' interrupt handler routine "crypto4xx_ce_interrupt_handler()"
by simply doing the iomap in front of the IRQ registration.

This way, the ce_base will always be valid in the handler and
a branch in an critical path can be avoided.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/amcc/crypto4xx_core.c

index c44954e..50d5e64 100644 (file)
@@ -1075,9 +1075,6 @@ static irqreturn_t crypto4xx_ce_interrupt_handler(int irq, void *data)
        struct device *dev = (struct device *)data;
        struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
 
-       if (!core_dev->dev->ce_base)
-               return 0;
-
        writel(PPC4XX_INTERRUPT_CLR,
               core_dev->dev->ce_base + CRYPTO4XX_INT_CLR);
        tasklet_schedule(&core_dev->tasklet);
@@ -1325,13 +1322,6 @@ static int crypto4xx_probe(struct platform_device *ofdev)
        tasklet_init(&core_dev->tasklet, crypto4xx_bh_tasklet_cb,
                     (unsigned long) dev);
 
-       /* Register for Crypto isr, Crypto Engine IRQ */
-       core_dev->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
-       rc = request_irq(core_dev->irq, crypto4xx_ce_interrupt_handler, 0,
-                        core_dev->dev->name, dev);
-       if (rc)
-               goto err_request_irq;
-
        core_dev->dev->ce_base = of_iomap(ofdev->dev.of_node, 0);
        if (!core_dev->dev->ce_base) {
                dev_err(dev, "failed to of_iomap\n");
@@ -1339,6 +1329,13 @@ static int crypto4xx_probe(struct platform_device *ofdev)
                goto err_iomap;
        }
 
+       /* Register for Crypto isr, Crypto Engine IRQ */
+       core_dev->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
+       rc = request_irq(core_dev->irq, crypto4xx_ce_interrupt_handler, 0,
+                        core_dev->dev->name, dev);
+       if (rc)
+               goto err_request_irq;
+
        /* need to setup pdr, rdr, gdr and sdr before this */
        crypto4xx_hw_init(core_dev->dev);
 
@@ -1352,11 +1349,11 @@ static int crypto4xx_probe(struct platform_device *ofdev)
        return 0;
 
 err_start_dev:
-       iounmap(core_dev->dev->ce_base);
-err_iomap:
        free_irq(core_dev->irq, dev);
 err_request_irq:
        irq_dispose_mapping(core_dev->irq);
+       iounmap(core_dev->dev->ce_base);
+err_iomap:
        tasklet_kill(&core_dev->tasklet);
 err_build_sdr:
        crypto4xx_destroy_sdr(core_dev->dev);