@@ -173,11 +173,12 @@ struct mtk_iommu_suspend_reg {
173
173
u32 misc_ctrl ;
174
174
u32 dcm_dis ;
175
175
u32 ctrl_reg ;
176
- u32 int_control0 ;
177
- u32 int_main_control ;
178
- u32 ivrp_paddr ;
179
176
u32 vld_pa_rng ;
180
177
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 ];
181
182
};
182
183
183
184
struct mtk_iommu_plat_data {
@@ -1302,16 +1303,23 @@ static int __maybe_unused mtk_iommu_runtime_suspend(struct device *dev)
1302
1303
{
1303
1304
struct mtk_iommu_data * data = dev_get_drvdata (dev );
1304
1305
struct mtk_iommu_suspend_reg * reg = & data -> reg ;
1305
- void __iomem * base = data -> bank [0 ].base ;
1306
+ void __iomem * base ;
1307
+ int i = 0 ;
1306
1308
1309
+ base = data -> bank [i ].base ;
1307
1310
reg -> wr_len_ctrl = readl_relaxed (base + REG_MMU_WR_LEN_CTRL );
1308
1311
reg -> misc_ctrl = readl_relaxed (base + REG_MMU_MISC_CTRL );
1309
1312
reg -> dcm_dis = readl_relaxed (base + REG_MMU_DCM_DIS );
1310
1313
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 );
1314
1314
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 );
1315
1323
clk_disable_unprepare (data -> bclk );
1316
1324
return 0 ;
1317
1325
}
@@ -1320,9 +1328,9 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
1320
1328
{
1321
1329
struct mtk_iommu_data * data = dev_get_drvdata (dev );
1322
1330
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 ;
1326
1334
1327
1335
ret = clk_prepare_enable (data -> bclk );
1328
1336
if (ret ) {
@@ -1334,18 +1342,26 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
1334
1342
* Uppon first resume, only enable the clk and return, since the values of the
1335
1343
* registers are not yet set.
1336
1344
*/
1337
- if (!m4u_dom )
1345
+ if (!reg -> wr_len_ctrl )
1338
1346
return 0 ;
1339
1347
1348
+ base = data -> bank [i ].base ;
1340
1349
writel_relaxed (reg -> wr_len_ctrl , base + REG_MMU_WR_LEN_CTRL );
1341
1350
writel_relaxed (reg -> misc_ctrl , base + REG_MMU_MISC_CTRL );
1342
1351
writel_relaxed (reg -> dcm_dis , base + REG_MMU_DCM_DIS );
1343
1352
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 );
1347
1353
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 );
1349
1365
1350
1366
/*
1351
1367
* Users may allocate dma buffer before they call pm_runtime_get,
0 commit comments