summaryrefslogtreecommitdiff
path: root/plat
diff options
context:
space:
mode:
authorKarl Li <karl.li@mediatek.corp-partner.google.com>2023-08-24 14:14:45 +0800
committerKarl Li <karl.li@mediatek.com>2023-10-03 13:27:18 +0800
commitb254b9815ee25c90264a2305940bc575910f55e4 (patch)
treea03917079a8db018beca519cec4d41b6d6245711 /plat
parenta1377a89a7838669359be3ba351a791405050ccc (diff)
feat(mt8188): add DSB before udelay
To ensure that all explicit memory accesses are complete before udelay, insert dsb before udelay. Change-Id: If119e920e29539ae8b68d3c44c8f77b5bf424a1a Signed-off-by: Karl Li <karl.li@mediatek.com>
Diffstat (limited to 'plat')
-rw-r--r--plat/mediatek/drivers/apusys/apusys_rv/2.0/apusys_rv.c1
-rw-r--r--plat/mediatek/drivers/apusys/mt8188/apusys_power.c12
2 files changed, 12 insertions, 1 deletions
diff --git a/plat/mediatek/drivers/apusys/apusys_rv/2.0/apusys_rv.c b/plat/mediatek/drivers/apusys/apusys_rv/2.0/apusys_rv.c
index c1b3de052..86c4b81c3 100644
--- a/plat/mediatek/drivers/apusys/apusys_rv/2.0/apusys_rv.c
+++ b/plat/mediatek/drivers/apusys/apusys_rv/2.0/apusys_rv.c
@@ -88,6 +88,7 @@ int apusys_kernel_apusys_rv_reset_mp(void)
mmio_write_32(MD32_SYS_CTRL, MD32_SYS_CTRL_RST);
+ dsb();
udelay(RESET_DEALY_US);
mmio_write_32(MD32_SYS_CTRL, MD32_G2B_CG_EN | MD32_DBG_EN | MD32_DM_AWUSER_IOMMU_EN |
diff --git a/plat/mediatek/drivers/apusys/mt8188/apusys_power.c b/plat/mediatek/drivers/apusys/mt8188/apusys_power.c
index cdfc13346..0a2781bfc 100644
--- a/plat/mediatek/drivers/apusys/mt8188/apusys_power.c
+++ b/plat/mediatek/drivers/apusys/mt8188/apusys_power.c
@@ -37,7 +37,6 @@ static int apu_poll(uintptr_t reg, uint32_t mask, uint32_t value, uint32_t timeo
if ((reg_val & mask) == value) {
return 0;
}
-
udelay(APU_POLL_STEP_US);
} while (--count);
@@ -169,15 +168,19 @@ int apusys_kernel_apusys_pwr_top_on(void)
static void apu_sleep_rpc_rcx(void)
{
mmio_write_32(APU_RPC_BASE + APU_RPC_TOP_CON, REG_WAKEUP_CLR);
+ dsb();
udelay(10);
mmio_setbits_32(APU_RPC_BASE + APU_RPC_TOP_SEL, (RPC_CTRL | RSV10));
+ dsb();
udelay(10);
mmio_setbits_32(APU_RPC_BASE + APU_RPC_TOP_CON, CLR_IRQ);
+ dsb();
udelay(10);
mmio_setbits_32(APU_RPC_BASE + APU_RPC_TOP_CON, SLEEP_REQ);
+ dsb();
udelay(100);
}
@@ -313,12 +316,15 @@ static void apu_acc_init(void)
static void apu_buck_off_cfg(void)
{
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_PROT_REQ_SET);
+ dsb();
udelay(10);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_ELS_EN_SET);
+ dsb();
udelay(10);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_AO_RST_B_CLR);
+ dsb();
udelay(10);
}
@@ -425,15 +431,19 @@ static void apu_aoc_init(void)
{
mmio_clrbits_32(SPM_BASE + APUSYS_BUCK_ISOLATION, IPU_EXT_BUCK_ISO);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_ELS_EN_CLR);
+ dsb();
udelay(10);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_AO_RST_B_SET);
+ dsb();
udelay(10);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, BUCK_PROT_REQ_CLR);
+ dsb();
udelay(10);
mmio_write_32(APU_RPC_BASE + APU_RPC_HW_CON, SRAM_AOC_ISO_CLR);
+ dsb();
udelay(10);
}