crypto: omap-sham - use runtime_pm autosuspend for clock handling
authorTero Kristo <t-kristo@ti.com>
Wed, 22 Jun 2016 13:23:34 +0000 (16:23 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 24 Jun 2016 13:24:57 +0000 (21:24 +0800)
Calling runtime PM API for every block causes serious performance hit to
crypto operations that are done on a long buffer. As crypto is performed
on a page boundary, encrypting large buffers can cause a series of crypto
operations divided by page. The runtime PM API is also called those many
times.

Convert the driver to use runtime_pm autosuspend instead, with a default
timeout value of 1 second. This results in upto ~50% speedup.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-sham.c

index 63464e86f2b1bdd77d115132933e5cbfbc20ecc9..887bc32b79938d6bcfd3b564c6c71cf023020fff 100644 (file)
 
 #define DEFAULT_TIMEOUT_INTERVAL       HZ
 
+#define DEFAULT_AUTOSUSPEND_DELAY      1000
+
 /* mostly device flags */
 #define FLAGS_BUSY             0
 #define FLAGS_FINAL            1
@@ -999,7 +1001,8 @@ static void omap_sham_finish_req(struct ahash_request *req, int err)
        dd->flags &= ~(BIT(FLAGS_BUSY) | BIT(FLAGS_FINAL) | BIT(FLAGS_CPU) |
                        BIT(FLAGS_DMA_READY) | BIT(FLAGS_OUTPUT_READY));
 
-       pm_runtime_put(dd->dev);
+       pm_runtime_mark_last_busy(dd->dev);
+       pm_runtime_put_autosuspend(dd->dev);
 
        if (req->base.complete)
                req->base.complete(&req->base, err);
@@ -1946,6 +1949,9 @@ static int omap_sham_probe(struct platform_device *pdev)
 
        dd->flags |= dd->pdata->flags;
 
+       pm_runtime_use_autosuspend(dev);
+       pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
+
        pm_runtime_enable(dev);
        pm_runtime_irq_safe(dev);