aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/atmel-sha.c
diff options
context:
space:
mode:
authorCyrille Pitchen <cyrille.pitchen@atmel.com>2017-01-26 11:07:48 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2017-02-03 05:16:12 -0500
commitb5ce82a7b4938f278fc6da28ce00da34e7a0773c (patch)
treed339df10118e56d3438d7b0c61a59beb77ff8c7a /drivers/crypto/atmel-sha.c
parenta29af939b24dc98c11e1e8a77be7669c4e4f5719 (diff)
crypto: atmel-sha - make atmel_sha_done_task more generic
This patch is a transitional patch. It updates atmel_sha_done_task() to make it more generic. Indeed, it adds a new .resume() member in the atmel_sha_dev structure. This hook is called from atmel_sha_done_task() to resume processing an asynchronous request. Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/atmel-sha.c')
-rw-r--r--drivers/crypto/atmel-sha.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c
index 2dbed8bb8d26..643d79a05dda 100644
--- a/drivers/crypto/atmel-sha.c
+++ b/drivers/crypto/atmel-sha.c
@@ -138,6 +138,7 @@ struct atmel_sha_dev {
138 struct crypto_queue queue; 138 struct crypto_queue queue;
139 struct ahash_request *req; 139 struct ahash_request *req;
140 bool is_async; 140 bool is_async;
141 atmel_sha_fn_t resume;
141 142
142 struct atmel_sha_dma dma_lch_in; 143 struct atmel_sha_dma dma_lch_in;
143 144
@@ -946,6 +947,8 @@ static int atmel_sha_handle_queue(struct atmel_sha_dev *dd,
946 return (start_async) ? ret : err; 947 return (start_async) ? ret : err;
947} 948}
948 949
950static int atmel_sha_done(struct atmel_sha_dev *dd);
951
949static int atmel_sha_start(struct atmel_sha_dev *dd) 952static int atmel_sha_start(struct atmel_sha_dev *dd)
950{ 953{
951 struct ahash_request *req = dd->req; 954 struct ahash_request *req = dd->req;
@@ -960,6 +963,7 @@ static int atmel_sha_start(struct atmel_sha_dev *dd)
960 if (err) 963 if (err)
961 goto err1; 964 goto err1;
962 965
966 dd->resume = atmel_sha_done;
963 if (ctx->op == SHA_OP_UPDATE) { 967 if (ctx->op == SHA_OP_UPDATE) {
964 err = atmel_sha_update_req(dd); 968 err = atmel_sha_update_req(dd);
965 if (err != -EINPROGRESS && (ctx->flags & SHA_FLAGS_FINUP)) 969 if (err != -EINPROGRESS && (ctx->flags & SHA_FLAGS_FINUP))
@@ -1215,13 +1219,10 @@ static void atmel_sha_queue_task(unsigned long data)
1215 atmel_sha_handle_queue(dd, NULL); 1219 atmel_sha_handle_queue(dd, NULL);
1216} 1220}
1217 1221
1218static void atmel_sha_done_task(unsigned long data) 1222static int atmel_sha_done(struct atmel_sha_dev *dd)
1219{ 1223{
1220 struct atmel_sha_dev *dd = (struct atmel_sha_dev *)data;
1221 int err = 0; 1224 int err = 0;
1222 1225
1223 dd->is_async = true;
1224
1225 if (SHA_FLAGS_CPU & dd->flags) { 1226 if (SHA_FLAGS_CPU & dd->flags) {
1226 if (SHA_FLAGS_OUTPUT_READY & dd->flags) { 1227 if (SHA_FLAGS_OUTPUT_READY & dd->flags) {
1227 dd->flags &= ~SHA_FLAGS_OUTPUT_READY; 1228 dd->flags &= ~SHA_FLAGS_OUTPUT_READY;
@@ -1245,11 +1246,21 @@ static void atmel_sha_done_task(unsigned long data)
1245 goto finish; 1246 goto finish;
1246 } 1247 }
1247 } 1248 }
1248 return; 1249 return err;
1249 1250
1250finish: 1251finish:
1251 /* finish curent request */ 1252 /* finish curent request */
1252 atmel_sha_finish_req(dd->req, err); 1253 atmel_sha_finish_req(dd->req, err);
1254
1255 return err;
1256}
1257
1258static void atmel_sha_done_task(unsigned long data)
1259{
1260 struct atmel_sha_dev *dd = (struct atmel_sha_dev *)data;
1261
1262 dd->is_async = true;
1263 (void)dd->resume(dd);
1253} 1264}
1254 1265
1255static irqreturn_t atmel_sha_irq(int irq, void *dev_id) 1266static irqreturn_t atmel_sha_irq(int irq, void *dev_id)