iommu/mediatek: Disable iommu clock when system suspend
authorYong Wu <yong.wu@mediatek.com>
Mon, 21 Aug 2017 11:00:19 +0000 (19:00 +0800)
committerJoerg Roedel <jroedel@suse.de>
Tue, 22 Aug 2017 14:37:59 +0000 (16:37 +0200)
When system suspend, infra power domain may be off, and the iommu's
clock must be disabled when system off, or the iommu's bclk clock maybe
disabled after system resume.

Signed-off-by: Honghui Zhang <honghui.zhang@mediatek.com>
Signed-off-by: Yong Wu <yong.wu@mediatek.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/mtk_iommu.c

index a82196c0c5dfce88846c8073aa15debb63d84e63..e21de8634cbac28663feb0c83c5f5f6cf89a8cca 100644 (file)
@@ -675,6 +675,7 @@ static int __maybe_unused mtk_iommu_suspend(struct device *dev)
        reg->ctrl_reg = readl_relaxed(base + REG_MMU_CTRL_REG);
        reg->int_control0 = readl_relaxed(base + REG_MMU_INT_CONTROL0);
        reg->int_main_control = readl_relaxed(base + REG_MMU_INT_MAIN_CONTROL);
+       clk_disable_unprepare(data->bclk);
        return 0;
 }
 
@@ -683,7 +684,13 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev)
        struct mtk_iommu_data *data = dev_get_drvdata(dev);
        struct mtk_iommu_suspend_reg *reg = &data->reg;
        void __iomem *base = data->base;
+       int ret;
 
+       ret = clk_prepare_enable(data->bclk);
+       if (ret) {
+               dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret);
+               return ret;
+       }
        writel_relaxed(reg->standard_axi_mode,
                       base + REG_MMU_STANDARD_AXI_MODE);
        writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS);
@@ -699,7 +706,7 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev)
 }
 
 static const struct dev_pm_ops mtk_iommu_pm_ops = {
-       SET_SYSTEM_SLEEP_PM_OPS(mtk_iommu_suspend, mtk_iommu_resume)
+       SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_iommu_suspend, mtk_iommu_resume)
 };
 
 static const struct of_device_id mtk_iommu_of_ids[] = {