akcipher_request_complete(req, ecode);
 }
 
-static void rsa_priv_f1_done(struct device *dev, u32 *desc, u32 err,
-                            void *context)
-{
-       struct akcipher_request *req = context;
-       struct rsa_edesc *edesc;
-       int ecode = 0;
-
-       if (err)
-               ecode = caam_jr_strstatus(dev, err);
-
-       edesc = container_of(desc, struct rsa_edesc, hw_desc[0]);
-
-       rsa_priv_f1_unmap(dev, edesc, req);
-       rsa_io_unmap(dev, edesc, req);
-       kfree(edesc);
-
-       akcipher_request_complete(req, ecode);
-}
-
-static void rsa_priv_f2_done(struct device *dev, u32 *desc, u32 err,
-                            void *context)
+static void rsa_priv_f_done(struct device *dev, u32 *desc, u32 err,
+                           void *context)
 {
        struct akcipher_request *req = context;
+       struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
+       struct caam_rsa_ctx *ctx = akcipher_tfm_ctx(tfm);
+       struct caam_rsa_key *key = &ctx->key;
        struct rsa_edesc *edesc;
        int ecode = 0;
 
 
        edesc = container_of(desc, struct rsa_edesc, hw_desc[0]);
 
-       rsa_priv_f2_unmap(dev, edesc, req);
-       rsa_io_unmap(dev, edesc, req);
-       kfree(edesc);
-
-       akcipher_request_complete(req, ecode);
-}
-
-static void rsa_priv_f3_done(struct device *dev, u32 *desc, u32 err,
-                            void *context)
-{
-       struct akcipher_request *req = context;
-       struct rsa_edesc *edesc;
-       int ecode = 0;
-
-       if (err)
-               ecode = caam_jr_strstatus(dev, err);
-
-       edesc = container_of(desc, struct rsa_edesc, hw_desc[0]);
+       switch (key->priv_form) {
+       case FORM1:
+               rsa_priv_f1_unmap(dev, edesc, req);
+               break;
+       case FORM2:
+               rsa_priv_f2_unmap(dev, edesc, req);
+               break;
+       case FORM3:
+               rsa_priv_f3_unmap(dev, edesc, req);
+       }
 
-       rsa_priv_f3_unmap(dev, edesc, req);
        rsa_io_unmap(dev, edesc, req);
        kfree(edesc);
 
        /* Initialize Job Descriptor */
        init_rsa_priv_f1_desc(edesc->hw_desc, &edesc->pdb.priv_f1);
 
-       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f1_done, req);
+       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f_done, req);
        if (!ret)
                return -EINPROGRESS;
 
        /* Initialize Job Descriptor */
        init_rsa_priv_f2_desc(edesc->hw_desc, &edesc->pdb.priv_f2);
 
-       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f2_done, req);
+       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f_done, req);
        if (!ret)
                return -EINPROGRESS;
 
        /* Initialize Job Descriptor */
        init_rsa_priv_f3_desc(edesc->hw_desc, &edesc->pdb.priv_f3);
 
-       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f3_done, req);
+       ret = caam_jr_enqueue(jrdev, edesc->hw_desc, rsa_priv_f_done, req);
        if (!ret)
                return -EINPROGRESS;