}
 #endif
 
-#if defined(CONFIG_SHA384)
+#if defined(CONFIG_SHA384) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
 static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
 {
        sha512_context *ctx = malloc(sizeof(sha512_context));
 }
 #endif
 
-#if defined(CONFIG_SHA512)
+#if defined(CONFIG_SHA512) && !defined(CONFIG_SHA_PROG_HW_ACCEL)
 static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
 {
        sha512_context *ctx = malloc(sizeof(sha512_context));
                .name           = "sha384",
                .digest_size    = SHA384_SUM_LEN,
                .chunk_size     = CHUNKSZ_SHA384,
+#ifdef CONFIG_SHA_HW_ACCEL
+               .hash_func_ws   = hw_sha384,
+#else
                .hash_func_ws   = sha384_csum_wd,
+#endif
+#ifdef CONFIG_SHA_PROG_HW_ACCEL
+               .hash_init      = hw_sha_init,
+               .hash_update    = hw_sha_update,
+               .hash_finish    = hw_sha_finish,
+#else
                .hash_init      = hash_init_sha384,
                .hash_update    = hash_update_sha384,
                .hash_finish    = hash_finish_sha384,
+#endif
        },
 #endif
 #ifdef CONFIG_SHA512
                .name           = "sha512",
                .digest_size    = SHA512_SUM_LEN,
                .chunk_size     = CHUNKSZ_SHA512,
+#ifdef CONFIG_SHA_HW_ACCEL
+               .hash_func_ws   = hw_sha512,
+#else
                .hash_func_ws   = sha512_csum_wd,
+#endif
+#ifdef CONFIG_SHA_PROG_HW_ACCEL
+               .hash_init      = hw_sha_init,
+               .hash_update    = hw_sha_update,
+               .hash_finish    = hw_sha_finish,
+#else
                .hash_init      = hash_init_sha512,
                .hash_update    = hash_update_sha512,
                .hash_finish    = hash_finish_sha512,
+#endif
        },
 #endif
        {
 
 #define __HW_SHA_H
 #include <hash.h>
 
+/**
+ * Computes hash value of input pbuf using h/w acceleration
+ *
+ * @param in_addr      A pointer to the input buffer
+ * @param bufleni      Byte length of input buffer
+ * @param out_addr     A pointer to the output buffer. When complete
+ *                     64 bytes are copied to pout[0]...pout[63]. Thus, a user
+ *                     should allocate at least 64 bytes at pOut in advance.
+ * @param chunk_size   chunk size for sha512
+ */
+void hw_sha512(const uchar *in_addr, uint buflen, uchar *out_addr,
+              uint chunk_size);
+
+/**
+ * Computes hash value of input pbuf using h/w acceleration
+ *
+ * @param in_addr      A pointer to the input buffer
+ * @param bufleni      Byte length of input buffer
+ * @param out_addr     A pointer to the output buffer. When complete
+ *                     48 bytes are copied to pout[0]...pout[47]. Thus, a user
+ *                     should allocate at least 48 bytes at pOut in advance.
+ * @param chunk_size   chunk size for sha384
+ */
+void hw_sha384(const uchar *in_addr, uint buflen, uchar *out_addr,
+              uint chunk_size);
+
 /**
  * Computes hash value of input pbuf using h/w acceleration
  *
 
 config SHA_HW_ACCEL
        bool "Enable hashing using hardware"
        help
-         This option enables hardware acceleration
-         for SHA1/SHA256 hashing.
-         This affects the 'hash' command and also the
-         hash_lookup_algo() function.
+         This option enables hardware acceleration for SHA hashing.
+         This affects the 'hash' command and also the hash_lookup_algo()
+         function.
 
 config SHA_PROG_HW_ACCEL
        bool "Enable Progressive hashing support using hardware"
        depends on SHA_HW_ACCEL
        help
-         This option enables hardware-acceleration for
-         SHA1/SHA256 progressive hashing.
-         Data can be streamed in a block at a time and the hashing
-         is performed in hardware.
+         This option enables hardware-acceleration for SHA progressive
+         hashing.
+         Data can be streamed in a block at a time and the hashing is
+         performed in hardware.
 
 config MD5
        bool "Support MD5 algorithm"