@@ -173,11 +173,12 @@ struct mtk_iommu_suspend_reg {
173173 u32 misc_ctrl ;
174174 u32 dcm_dis ;
175175 u32 ctrl_reg ;
176- u32 int_control0 ;
177- u32 int_main_control ;
178- u32 ivrp_paddr ;
179176 u32 vld_pa_rng ;
180177 u32 wr_len_ctrl ;
178+
179+ u32 int_control [MTK_IOMMU_BANK_MAX ];
180+ u32 int_main_control [MTK_IOMMU_BANK_MAX ];
181+ u32 ivrp_paddr [MTK_IOMMU_BANK_MAX ];
181182};
182183
183184struct mtk_iommu_plat_data {
@@ -1302,16 +1303,23 @@ static int __maybe_unused mtk_iommu_runtime_suspend(struct device *dev)
13021303{
13031304 struct mtk_iommu_data * data = dev_get_drvdata (dev );
13041305 struct mtk_iommu_suspend_reg * reg = & data -> reg ;
1305- void __iomem * base = data -> bank [0 ].base ;
1306+ void __iomem * base ;
1307+ int i = 0 ;
13061308
1309+ base = data -> bank [i ].base ;
13071310 reg -> wr_len_ctrl = readl_relaxed (base + REG_MMU_WR_LEN_CTRL );
13081311 reg -> misc_ctrl = readl_relaxed (base + REG_MMU_MISC_CTRL );
13091312 reg -> dcm_dis = readl_relaxed (base + REG_MMU_DCM_DIS );
13101313 reg -> ctrl_reg = readl_relaxed (base + REG_MMU_CTRL_REG );
1311- reg -> int_control0 = readl_relaxed (base + REG_MMU_INT_CONTROL0 );
1312- reg -> int_main_control = readl_relaxed (base + REG_MMU_INT_MAIN_CONTROL );
1313- reg -> ivrp_paddr = readl_relaxed (base + REG_MMU_IVRP_PADDR );
13141314 reg -> vld_pa_rng = readl_relaxed (base + REG_MMU_VLD_PA_RNG );
1315+ do {
1316+ if (!data -> plat_data -> banks_enable [i ])
1317+ continue ;
1318+ base = data -> bank [i ].base ;
1319+ reg -> int_control [i ] = readl_relaxed (base + REG_MMU_INT_CONTROL0 );
1320+ reg -> int_main_control [i ] = readl_relaxed (base + REG_MMU_INT_MAIN_CONTROL );
1321+ reg -> ivrp_paddr [i ] = readl_relaxed (base + REG_MMU_IVRP_PADDR );
1322+ } while (++ i < data -> plat_data -> banks_num );
13151323 clk_disable_unprepare (data -> bclk );
13161324 return 0 ;
13171325}
@@ -1320,9 +1328,9 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
13201328{
13211329 struct mtk_iommu_data * data = dev_get_drvdata (dev );
13221330 struct mtk_iommu_suspend_reg * reg = & data -> reg ;
1323- struct mtk_iommu_domain * m4u_dom = data -> bank [ 0 ]. m4u_dom ;
1324- void __iomem * base = data -> bank [ 0 ]. base ;
1325- int ret ;
1331+ struct mtk_iommu_domain * m4u_dom ;
1332+ void __iomem * base ;
1333+ int ret , i = 0 ;
13261334
13271335 ret = clk_prepare_enable (data -> bclk );
13281336 if (ret ) {
@@ -1334,18 +1342,26 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
13341342 * Uppon first resume, only enable the clk and return, since the values of the
13351343 * registers are not yet set.
13361344 */
1337- if (!m4u_dom )
1345+ if (!reg -> wr_len_ctrl )
13381346 return 0 ;
13391347
1348+ base = data -> bank [i ].base ;
13401349 writel_relaxed (reg -> wr_len_ctrl , base + REG_MMU_WR_LEN_CTRL );
13411350 writel_relaxed (reg -> misc_ctrl , base + REG_MMU_MISC_CTRL );
13421351 writel_relaxed (reg -> dcm_dis , base + REG_MMU_DCM_DIS );
13431352 writel_relaxed (reg -> ctrl_reg , base + REG_MMU_CTRL_REG );
1344- writel_relaxed (reg -> int_control0 , base + REG_MMU_INT_CONTROL0 );
1345- writel_relaxed (reg -> int_main_control , base + REG_MMU_INT_MAIN_CONTROL );
1346- writel_relaxed (reg -> ivrp_paddr , base + REG_MMU_IVRP_PADDR );
13471353 writel_relaxed (reg -> vld_pa_rng , base + REG_MMU_VLD_PA_RNG );
1348- writel (m4u_dom -> cfg .arm_v7s_cfg .ttbr & MMU_PT_ADDR_MASK , base + REG_MMU_PT_BASE_ADDR );
1354+ do {
1355+ m4u_dom = data -> bank [i ].m4u_dom ;
1356+ if (!data -> plat_data -> banks_enable [i ] || !m4u_dom )
1357+ continue ;
1358+ base = data -> bank [i ].base ;
1359+ writel_relaxed (reg -> int_control [i ], base + REG_MMU_INT_CONTROL0 );
1360+ writel_relaxed (reg -> int_main_control [i ], base + REG_MMU_INT_MAIN_CONTROL );
1361+ writel_relaxed (reg -> ivrp_paddr [i ], base + REG_MMU_IVRP_PADDR );
1362+ writel (m4u_dom -> cfg .arm_v7s_cfg .ttbr & MMU_PT_ADDR_MASK ,
1363+ base + REG_MMU_PT_BASE_ADDR );
1364+ } while (++ i < data -> plat_data -> banks_num );
13491365
13501366 /*
13511367 * Users may allocate dma buffer before they call pm_runtime_get,
0 commit comments