#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <crypto/scatterwalk.h>
 #include <linux/scatterlist.h>
 
 #include "sun4i-ss.h"
 
+static const struct ss_variant ss_a10_variant = {
+       .sha1_in_be = false,
+};
+
+static const struct ss_variant ss_a33_variant = {
+       .sha1_in_be = true,
+};
+
 static struct sun4i_ss_alg_template ss_algs[] = {
 {       .type = CRYPTO_ALG_TYPE_AHASH,
        .mode = SS_OP_MD5,
                return PTR_ERR(ss->base);
        }
 
+       ss->variant = of_device_get_match_data(&pdev->dev);
+       if (!ss->variant) {
+               dev_err(&pdev->dev, "Missing Security System variant\n");
+               return -EINVAL;
+       }
+
        ss->ssclk = devm_clk_get(&pdev->dev, "mod");
        if (IS_ERR(ss->ssclk)) {
                err = PTR_ERR(ss->ssclk);
 }
 
 static const struct of_device_id a20ss_crypto_of_match_table[] = {
-       { .compatible = "allwinner,sun4i-a10-crypto" },
+       { .compatible = "allwinner,sun4i-a10-crypto",
+         .data = &ss_a10_variant
+       },
+       { .compatible = "allwinner,sun8i-a33-crypto",
+         .data = &ss_a33_variant
+       },
        {}
 };
 MODULE_DEVICE_TABLE(of, a20ss_crypto_of_match_table);
 
        /* Get the hash from the device */
        if (op->mode == SS_OP_SHA1) {
                for (i = 0; i < 5; i++) {
-                       v = cpu_to_be32(readl(ss->base + SS_MD0 + i * 4));
+                       if (ss->variant->sha1_in_be)
+                               v = cpu_to_le32(readl(ss->base + SS_MD0 + i * 4));
+                       else
+                               v = cpu_to_be32(readl(ss->base + SS_MD0 + i * 4));
                        memcpy(areq->result + i * 4, &v, 4);
                }
        } else {