aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Fernandes <joelf@ti.com>2013-08-17 22:42:31 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2013-08-21 07:28:04 -0400
commit1801ad9483b796271a985ab71cfe26f7bbeae6dd (patch)
tree5af60871fbae39f17ef4f242ccf0c09c61c6d67a
parent98837abc86ebd26c1518c91cc5e2a9344837e6a8 (diff)
crypto: omap-aes - Switch to PIO mode during probe
In cases where requesting for DMA channels fails for some reason, or channel numbers are not provided in DT or platform data, we switch to PIO-only mode also checking if platform provides IRQ numbers and interrupt register offsets in DT and platform data. All dma-only paths are avoided in this mode. Signed-off-by: Joel Fernandes <joelf@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/omap-aes.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c
index 685535e4c78d..7a08a152838a 100644
--- a/drivers/crypto/omap-aes.c
+++ b/drivers/crypto/omap-aes.c
@@ -1075,7 +1075,7 @@ static int omap_aes_probe(struct platform_device *pdev)
1075 struct omap_aes_dev *dd; 1075 struct omap_aes_dev *dd;
1076 struct crypto_alg *algp; 1076 struct crypto_alg *algp;
1077 struct resource res; 1077 struct resource res;
1078 int err = -ENOMEM, i, j; 1078 int err = -ENOMEM, i, j, irq = -1;
1079 u32 reg; 1079 u32 reg;
1080 1080
1081 dd = kzalloc(sizeof(struct omap_aes_dev), GFP_KERNEL); 1081 dd = kzalloc(sizeof(struct omap_aes_dev), GFP_KERNEL);
@@ -1118,8 +1118,23 @@ static int omap_aes_probe(struct platform_device *pdev)
1118 tasklet_init(&dd->queue_task, omap_aes_queue_task, (unsigned long)dd); 1118 tasklet_init(&dd->queue_task, omap_aes_queue_task, (unsigned long)dd);
1119 1119
1120 err = omap_aes_dma_init(dd); 1120 err = omap_aes_dma_init(dd);
1121 if (err) 1121 if (err && AES_REG_IRQ_STATUS(dd) && AES_REG_IRQ_ENABLE(dd)) {
1122 goto err_dma; 1122 dd->pio_only = 1;
1123
1124 irq = platform_get_irq(pdev, 0);
1125 if (irq < 0) {
1126 dev_err(dev, "can't get IRQ resource\n");
1127 goto err_irq;
1128 }
1129
1130 err = request_irq(irq, omap_aes_irq, 0,
1131 dev_name(dev), dd);
1132 if (err) {
1133 dev_err(dev, "Unable to grab omap-aes IRQ\n");
1134 goto err_irq;
1135 }
1136 }
1137
1123 1138
1124 INIT_LIST_HEAD(&dd->list); 1139 INIT_LIST_HEAD(&dd->list);
1125 spin_lock(&list_lock); 1140 spin_lock(&list_lock);
@@ -1147,8 +1162,11 @@ err_algs:
1147 for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) 1162 for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
1148 crypto_unregister_alg( 1163 crypto_unregister_alg(
1149 &dd->pdata->algs_info[i].algs_list[j]); 1164 &dd->pdata->algs_info[i].algs_list[j]);
1150 omap_aes_dma_cleanup(dd); 1165 if (dd->pio_only)
1151err_dma: 1166 free_irq(irq, dd);
1167 else
1168 omap_aes_dma_cleanup(dd);
1169err_irq:
1152 tasklet_kill(&dd->done_task); 1170 tasklet_kill(&dd->done_task);
1153 tasklet_kill(&dd->queue_task); 1171 tasklet_kill(&dd->queue_task);
1154 pm_runtime_disable(dev); 1172 pm_runtime_disable(dev);