struct omap_des_ctx *ctx = crypto_ablkcipher_ctx(cipher);
        struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 
-       if (keylen != DES_KEY_SIZE && keylen != (3*DES_KEY_SIZE))
-               return -EINVAL;
-
        pr_debug("enter, keylen: %d\n", keylen);
 
        /* Do we need to test against weak key? */
        return 0;
 }
 
+static int omap_des3_setkey(struct crypto_ablkcipher *cipher, const u8 *key,
+                          unsigned int keylen)
+{
+       struct omap_des_ctx *ctx = crypto_ablkcipher_ctx(cipher);
+       u32 flags;
+       int err;
+
+       pr_debug("enter, keylen: %d\n", keylen);
+
+       flags = crypto_ablkcipher_get_flags(cipher);
+       err = __des3_verify_key(&flags, key);
+       if (unlikely(err)) {
+               crypto_ablkcipher_set_flags(cipher, flags);
+               return err;
+       }
+
+       memcpy(ctx->key, key, keylen);
+       ctx->keylen = keylen;
+
+       return 0;
+}
+
 static int omap_des_ecb_encrypt(struct ablkcipher_request *req)
 {
        return omap_des_crypt(req, FLAGS_ENCRYPT);
        .cra_u.ablkcipher = {
                .min_keysize    = 3*DES_KEY_SIZE,
                .max_keysize    = 3*DES_KEY_SIZE,
-               .setkey         = omap_des_setkey,
+               .setkey         = omap_des3_setkey,
                .encrypt        = omap_des_ecb_encrypt,
                .decrypt        = omap_des_ecb_decrypt,
        }
                .min_keysize    = 3*DES_KEY_SIZE,
                .max_keysize    = 3*DES_KEY_SIZE,
                .ivsize         = DES_BLOCK_SIZE,
-               .setkey         = omap_des_setkey,
+               .setkey         = omap_des3_setkey,
                .encrypt        = omap_des_cbc_encrypt,
                .decrypt        = omap_des_cbc_decrypt,
        }