#include <linux/clk.h>
 #include <linux/clk-provider.h>
+#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
        .num_resets     = ARRAY_SIZE(sun50i_h5_de2_resets),
 };
 
+static const struct sunxi_ccu_desc sun50i_h616_de33_clk_desc = {
+       .ccu_clks       = sun8i_de2_ccu_clks,
+       .num_ccu_clks   = ARRAY_SIZE(sun8i_de2_ccu_clks),
+
+       .hw_clks        = &sun8i_h3_de2_hw_clks,
+
+       .resets         = sun50i_h5_de2_resets,
+       .num_resets     = ARRAY_SIZE(sun50i_h5_de2_resets),
+};
+
 static int sunxi_de2_clk_probe(struct platform_device *pdev)
 {
        struct clk *bus_clk, *mod_clk;
                goto err_disable_mod_clk;
        }
 
+       /*
+        * The DE33 requires these additional (unknown) registers set
+        * during initialisation.
+        */
+       if (of_device_is_compatible(pdev->dev.of_node,
+                                   "allwinner,sun50i-h616-de33-clk")) {
+               writel(0, reg + 0x24);
+               writel(0x0000a980, reg + 0x28);
+       }
+
        ret = devm_sunxi_ccu_probe(&pdev->dev, reg, ccu_desc);
        if (ret)
                goto err_assert_reset;
                .compatible = "allwinner,sun50i-h6-de3-clk",
                .data = &sun50i_h5_de2_clk_desc,
        },
+       {
+               .compatible = "allwinner,sun50i-h616-de33-clk",
+               .data = &sun50i_h616_de33_clk_desc,
+       },
        { }
 };
 MODULE_DEVICE_TABLE(of, sunxi_de2_clk_ids);