keylen != AES_KEYSIZE_256)
                return -EINVAL;
        ctx->keylen = keylen;
-       memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, key, keylen);
+       memcpy(ctx->key, key, keylen);
 
        return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
 }
                return err;
 
        ctx->keylen = keylen;
-       memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
+       memcpy(ctx->key, key, keylen);
 
        return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
 }
                return err;
 
        ctx->keylen = keylen;
-       memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
+       memcpy(ctx->key, key, keylen);
+
        return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
 }
 
                             RK_CRYPTO_TDES_BYTESWAP_IV;
                CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
                memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize);
+               memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
                conf_reg = RK_CRYPTO_DESSEL;
        } else {
                rctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
                        rctx->mode |= RK_CRYPTO_AES_256BIT_key;
                CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
                memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize);
+               memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
        }
        conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
                    RK_CRYPTO_BYTESWAP_BRFIFO;
 {
        struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
 
+       memzero_explicit(ctx->key, ctx->keylen);
        free_page((unsigned long)ctx->dev->addr_vir);
        crypto_free_skcipher(ctx->fallback_tfm);
 }