]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
crypto: omap-aes - PIO mode: platform data for OMAP4/AM437x and trigger
authorJoel Fernandes <joelf@ti.com>
Sun, 18 Aug 2013 02:42:30 +0000 (21:42 -0500)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 21 Aug 2013 11:28:03 +0000 (21:28 +1000)
We initialize the scatter gather walk lists needed for PIO mode and avoid all
DMA paths such as mapping/unmapping buffers by checking for the pio_only flag.

Signed-off-by: Joel Fernandes <joelf@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-aes.c

index 9909f93255b43dbb5175a88c34dec00228597b44..685535e4c78d8636da7827ce4c984098bf205d83 100644 (file)
@@ -169,6 +169,7 @@ struct omap_aes_dev {
        struct dma_chan         *dma_lch_out;
        int                     in_sg_len;
        int                     out_sg_len;
+       int                     pio_only;
        const struct omap_aes_pdata     *pdata;
 };
 
@@ -408,6 +409,16 @@ static int omap_aes_crypt_dma(struct crypto_tfm *tfm,
        struct dma_slave_config cfg;
        int ret;
 
+       if (dd->pio_only) {
+               scatterwalk_start(&dd->in_walk, dd->in_sg);
+               scatterwalk_start(&dd->out_walk, dd->out_sg);
+
+               /* Enable DATAIN interrupt and let it take
+                  care of the rest */
+               omap_aes_write(dd, AES_REG_IRQ_ENABLE(dd), 0x2);
+               return 0;
+       }
+
        dma_sync_sg_for_device(dd->dev, dd->in_sg, in_sg_len, DMA_TO_DEVICE);
 
        memset(&cfg, 0, sizeof(cfg));
@@ -477,21 +488,25 @@ static int omap_aes_crypt_dma_start(struct omap_aes_dev *dd)
 
        pr_debug("total: %d\n", dd->total);
 
-       err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
-       if (!err) {
-               dev_err(dd->dev, "dma_map_sg() error\n");
-               return -EINVAL;
-       }
+       if (!dd->pio_only) {
+               err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len,
+                                DMA_TO_DEVICE);
+               if (!err) {
+                       dev_err(dd->dev, "dma_map_sg() error\n");
+                       return -EINVAL;
+               }
 
-       err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len, DMA_FROM_DEVICE);
-       if (!err) {
-               dev_err(dd->dev, "dma_map_sg() error\n");
-               return -EINVAL;
+               err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len,
+                                DMA_FROM_DEVICE);
+               if (!err) {
+                       dev_err(dd->dev, "dma_map_sg() error\n");
+                       return -EINVAL;
+               }
        }
 
        err = omap_aes_crypt_dma(tfm, dd->in_sg, dd->out_sg, dd->in_sg_len,
                                 dd->out_sg_len);
-       if (err) {
+       if (err && !dd->pio_only) {
                dma_unmap_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
                dma_unmap_sg(dd->dev, dd->out_sg, dd->out_sg_len,
                             DMA_FROM_DEVICE);
@@ -594,9 +609,11 @@ static void omap_aes_done_task(unsigned long data)
 
        pr_debug("enter done_task\n");
 
-       dma_sync_sg_for_cpu(dd->dev, dd->in_sg, dd->in_sg_len, DMA_FROM_DEVICE);
-
-       omap_aes_crypt_dma_stop(dd);
+       if (!dd->pio_only) {
+               dma_sync_sg_for_device(dd->dev, dd->out_sg, dd->out_sg_len,
+                                      DMA_FROM_DEVICE);
+               omap_aes_crypt_dma_stop(dd);
+       }
        omap_aes_finish_req(dd, 0);
        omap_aes_handle_queue(dd, NULL);