struct device *dev;
        struct clk *nfi_clk;
        struct clk *pad_clk;
+       struct clk *nfi_hclk;
        void __iomem *nfi_base;
        int irq;
        struct completion op_done;
                dev_err(ms->dev, "unable to enable pad clk\n");
                goto err1;
        }
+       ret = clk_prepare_enable(ms->nfi_hclk);
+       if (ret) {
+               dev_err(ms->dev, "unable to enable nfi hclk\n");
+               goto err2;
+       }
+
        return 0;
+
+err2:
+       clk_disable_unprepare(ms->pad_clk);
 err1:
        clk_disable_unprepare(ms->nfi_clk);
        return ret;
 
 static void mtk_snand_disable_clk(struct mtk_snand *ms)
 {
+       clk_disable_unprepare(ms->nfi_hclk);
        clk_disable_unprepare(ms->pad_clk);
        clk_disable_unprepare(ms->nfi_clk);
 }
                goto release_ecc;
        }
 
+       ms->nfi_hclk = devm_clk_get_optional(&pdev->dev, "nfi_hclk");
+       if (IS_ERR(ms->nfi_hclk)) {
+               ret = PTR_ERR(ms->nfi_hclk);
+               dev_err(&pdev->dev, "unable to get nfi_hclk, err = %d\n", ret);
+               goto release_ecc;
+       }
+
        ret = mtk_snand_enable_clk(ms);
        if (ret)
                goto release_ecc;