static int mtk_iommu_hw_init(const struct mtk_iommu_data *data)
 {
        u32 regval;
-       int ret;
-
-       ret = clk_prepare_enable(data->bclk);
-       if (ret) {
-               dev_err(data->dev, "Failed to enable iommu bclk(%d)\n", ret);
-               return ret;
-       }
 
        if (data->plat_data->m4u_plat == M4U_MT8173) {
                regval = F_MMU_PREFETCH_RT_REPLACE_MOD |
        if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0,
                             dev_name(data->dev), (void *)data)) {
                writel_relaxed(0, data->base + REG_MMU_PT_BASE_ADDR);
-               clk_disable_unprepare(data->bclk);
                dev_err(data->dev, "Failed @ IRQ-%d Request\n", data->irq);
                return -ENODEV;
        }
        void __iomem *base = data->base;
        int ret;
 
-       /* Avoid first resume to affect the default value of registers below. */
-       if (!m4u_dom)
-               return 0;
        ret = clk_prepare_enable(data->bclk);
        if (ret) {
                dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret);
                return ret;
        }
+
+       /*
+        * Uppon first resume, only enable the clk and return, since the values of the
+        * registers are not yet set.
+        */
+       if (!m4u_dom)
+               return 0;
+
        writel_relaxed(reg->wr_len_ctrl, base + REG_MMU_WR_LEN_CTRL);
        writel_relaxed(reg->misc_ctrl, base + REG_MMU_MISC_CTRL);
        writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS);